我有以下类(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/

10-12 04:36