如何使用Injekt库中generics的injectLazy()委托?
我有一个下面的类层次结构
interface Presenter abstract class MvpFragment : Fragment() { val presenter by injectLazy
() // error: Cannot use 'T' as reified type parameter. Use a class instead. }
有没有办法使用带有generics的injectLazy
委托? 我可以将一个KClass
作为parameter passing给MvpFragment
,但我仍然不知道如何使用它来注入一个P
对象。
编译Java代码时,genericstypes参数将被删除。 Kotlin提供了一个function,内联函数可以保持这个types的信息一直到程序的运行时间。 这个特性是injectLazy
函数用来确定types参数的。
在你的情况下,types参数P
来自类,所以Kotlin编译器无法对其进行表示,这意味着编译为Java字节码时会被擦除。 在删除types参数后,不能再调用injectLazy
函数,因为types信息在运行时将丢失。 这就是编译器给你错误的原因。
您必须将KClass
对象传递给您的类,并使用它来注入依赖关系,从而手动对types进行分类。
我终于find了一个方法来做到这一点。 但是我必须先添加两个新的函数:
fun typeRef(type: KClass) = object : TypeReference { override val type = type.java } fun injectLazy(type: KClass ): Lazy { return lazy { Injekt.get(forType = typeRef(type)) } }
现在我可以写:
abstract class MvpFragment(presenterClass: KClass
) : Fragment() { protected val presenter by injectLazy(type = presenterClass) }