kotlin - 如何将 Injekt 库中的injectLazy() 委托(delegate)与泛型一起使用?

标签 kotlin kohesive-injekt

我有以下类层次结构

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/

相关文章:

arrays - Kotlin:泛型数组的泛型集合

android - 房间数据库 : Still getting "no value passed for parameter ' id' "even though it is meant to be autogenerated

for-loop - 为什么在 Kotlin 中删除了索引 for 循环?

kotlin,如何检查索引是否在范围内

dependency-injection - 在 Kotlin 的 Injekt 库中,如何注入(inject)函数而不仅仅是值?

java - 如何通过模型构造函数在 Spring boot 中进行查询