我有一个抽象的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>
答案 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> {...}
}