如何使用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) }