使用从Kotlin数据类生成的代码时出现"不兼容类型"错误

Bra*_*ell 6 java kotlin

如果我反编译生成的.class文件,data class State(val b: List<Array<Int>>)我会得到以下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;
    }

    // ...
}
Run Code Online (Sandbox Code Playgroud)

如果我将这个java代码复制/粘贴到我的IDE(Intellij 15)中,我在getB()方法中得到以下编译错误:

Incompatible types.

Required: List<Integer[]>
Found:    List<? extends Integer[]>
Run Code Online (Sandbox Code Playgroud)

我在这里错过了什么?Kotlin如何生成代码而不是我的复制/粘贴版本?

yol*_*ole 12

通常,当javac加载.class文件时,它不会对该类中的代码执行完整的类型检查; 它将信任字节码中指定的通用签名.因此,其他JVM语言可以生成javac本身拒绝生成的签名.

在这个特定的情况下,Kotlin beta 4生成的通配符没有意义(Integer[]是最终类,因此? extends Integer[]没用),因此当前开发版本在此示例中不生成任何通配符.

更一般地说,我们的目标是确保用Kotlin编写的API很容易从Java代码中消费,为了实现这一点,Kotlin允许您控制它在哪里生成通配符.这说明在这里下的"Java通配符".