【问题标题】:Java/Kotlin generic list incompatible types with wildcard带有通配符的 Java/Kotlin 泛型列表不兼容类型
【发布时间】:2018-05-03 18:48:27
【问题描述】:

我有一个抽象 Java 类,它有一个调用子类中的方法的具体方法:

abstract class JavaSuperclass<T> {
    T doSomething() {
        ...
        return doSomethingInSubclass();
    }

    abstract T doSomethingInSubclass();
}

我有一个 Java 子类,其泛型类型设置为 List:

class JavaSubclass extends JavaSuperclass<List<WhateverJava>> {
    List<WhateverJava> doSomethingInSubclass() {...}
}

我有一个 Kotlin 子类:

class KotlinSubclass : JavaSuperclass<List<WhateverKotlin>> {
    override fun doSomethingInSubclass(): List<WhateverKotlin> {...}
}

WhateverJava 是 Java 类,WhateverKotlin 是 Kotlin 数据类。)

然后在一个 Java 类中我同时使用两个子类。

List<WhateverJava> listFromJava = javaSubclass.doSomething();
List<WhateverKotlin> listFromKotlin = kotlinSubclass.doSomething();

调用 Java 子类的那一行编译正常,但调用 Kotlin 子类的那一行却报错:

error: incompatible types: List<capture<? extends WhateverKotlin>> cannot be converted to List<WhateverKotlin>

【问题讨论】:

    标签: java generics kotlin


    【解决方案1】:

    Kotlin 中的列表是协变的。所以 Kotlin 类转换为 Java 为:

    class KotlinSubclass extends JavaSuperclass<List<? extends WhateverKotlin>>
    

    在 Kotlin 类中添加 @JvmSuppressWildcards 注释可以修复它。

    class KotlinSubclass : JavaSuperclass<@JvmSuppressWildcards List<WhateverKotlin>> {
        override fun doSomethingInSubclass(): List<WhateverKotlin> {...}
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-11-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-09-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多