Java / Kotlin通用列表与通配符不兼容的类型

时间:2018-05-03 18:48:28

标签: java generics kotlin

我有一个抽象的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>

1 个答案:

答案 0 :(得分:2)

Kotlin的名单是协变的。因此,Kotlin类将Java转换为:

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

向Kotlin类添加@JvmSuppressWildcards注释会修复它。

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