如果我反编译由data class State(val b: List<Array<Int>>)
生成的.class文件,那么我会得到以下Java代码:
public final class State {
private final List<? extends Integer[]> b;
public State(List<? extends Integer[]> b) {
this.b = b;
}
public final List<Integer[]> getB() {
return this.b;
}
// ...
}
如果我将这个java代码复制/粘贴到我的IDE(Intellij 15)中,我在getB()
方法中得到以下编译错误:
Incompatible types.
Required: List<Integer[]>
Found: List<? extends Integer[]>
我在这里缺少什么? Kotlin如何生成代码而不是我的复制/粘贴版本?
答案 0 :(得分:12)
通常,当javac加载.class文件时,它不会对该类中的代码执行完整的类型检查;它将信任字节码中指定的通用签名。因此,其他JVM语言可以生成javac本身拒绝生成的签名。
在这种特定情况下,Kotlin beta 4生成的通配符没有意义(Integer[]
是最终类,因此? extends Integer[]
无用),因此当前的开发版本不会生成这个例子中的任何通配符。
更一般地说,我们的目标是确保用Kotlin编写的API很容易从Java代码中消费,为了实现这一点,Kotlin允许您控制它在哪里生成通配符。这是{&#34; Java通配符&#34;。
下的here