我有以下类(class)层次结构
interface Presenter
abstract class MvpFragment<P: Presenter> : Fragment() {
val presenter by injectLazy<P>() // error: Cannot use 'T' as reified type parameter. Use a class instead.
}
有什么方法可以将
injectLazy
委托(delegate)与泛型一起使用?我可以将KClass<P>
作为参数传递给MvpFragment
,但是我仍然不知道如何使用它来注入(inject)P
对象。 最佳答案
编译Java代码时,将删除通用类型参数。 Kotlin提供了一项功能,内联函数可以在程序运行期间一直保留这种类型的信息。该功能是injectLazy<T>
函数用来验证type参数的功能。
但是,在您的情况下,类型参数P
来自该类,因此Kotlin编译器无法对其进行验证,这意味着在编译为Java字节码时会被擦除。删除类型参数后,就不再可以调用injectLazy<T>
函数,因为在运行时会丢失类型信息。这就是编译器给您错误的原因。
您将必须将KClass<P>
对象传递给您的类,并使用该对象来注入(inject)依赖项,从而手动排序类型。
关于kotlin - 如何将Injekt库中的injectLazy()委托(delegate)与泛型一起使用?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36156668/