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

Eri*_*wne 1 java generics kotlin

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

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

    abstract T doSomethingInSubclass();
}
Run Code Online (Sandbox Code Playgroud)

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

class JavaSubclass extends JavaSuperclass<List<WhateverJava>> {
    List<WhateverJava> doSomethingInSubclass() {...}
}
Run Code Online (Sandbox Code Playgroud)

我有一个 Kotlin 子类:

class KotlinSubclass : JavaSuperclass<List<WhateverKotlin>> {
    override fun doSomethingInSubclass(): List<WhateverKotlin> {...}
}
Run Code Online (Sandbox Code Playgroud)

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

然后在 Java 类中我使用这两个子类。

List<WhateverJava> listFromJava = javaSubclass.doSomething();
List<WhateverKotlin> listFromKotlin = kotlinSubclass.doSomething();
Run Code Online (Sandbox Code Playgroud)

调用 Java 子类的行可以正常编译,但调用 Kotlin 子类的行会出现以下错误:

error: incompatible types: List<capture<? extends WhateverKotlin>> cannot be converted to List<WhateverKotlin>
Run Code Online (Sandbox Code Playgroud)

Eri*_*wne 5

Kotlin 中的列表是协变的。所以 Kotlin 类翻译成 Java 如下:

class KotlinSubclass extends JavaSuperclass<List<? extends WhateverKotlin>>
Run Code Online (Sandbox Code Playgroud)

@JvmSuppressWildcards向 Kotlin 类添加注释可以修复此问题。

class KotlinSubclass : JavaSuperclass<@JvmSuppressWildcards List<WhateverKotlin>> {
    override fun doSomethingInSubclass(): List<WhateverKotlin> {...}
}
Run Code Online (Sandbox Code Playgroud)