我有以下类层次结构
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>
的功能。函数用于具体化类型参数。
但就您而言,类型参数 P
来自类,因此 Kotlin 编译器无法具体化它,这意味着在编译为 Java 字节码时它会被删除。删除类型参数后,injectLazy<T>
函数无法再被调用,因为运行时类型信息将丢失。这就是编译器给出错误的原因。
您必须通过KClass<P>
对象到您的类并使用它来注入(inject)依赖项,从而手动具体化类型。
关于kotlin - 如何将 Injekt 库中的injectLazy() 委托(delegate)与泛型一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36156668/