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)
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)
| 归档时间: |
|
| 查看次数: |
1009 次 |
| 最近记录: |