使用从Kotlin数据类生成的代码时出现“不兼容的类型”错误
如果我反编译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生成的代码如何能够做到这一点,但不是我的复制/粘贴版本?
一般来说,当javac加载一个.class文件时,它不会对该类中的代码进行完整的类型检查; 它将信任字节码中指定的通用签名。 因此,其他JVM语言可以生成javac本身拒绝生成的签名。
在这个具体的例子中,由Kotlin beta 4生成的通配符没有任何意义( Integer[]
是最后一个类,所以? extends Integer[]
是无用的),所以当前的开发版本在这个例子中不会生成任何通配符。
更一般地说,我们的目标是确保使用Kotlin编写的API易于从Java代码中使用,为了实现这一点,Kotlin可以让您控制在哪里生成通配符。 这在“Java通配符”下描述。
- Spring Data JPA + Guice错误:使用@EnableTransactionManagement注解时,没有类型的主要bean定义
- Spring Boot:添加@Transactional会产生java.lang.ClassNotFoundException:org.aspectj.util.PartialOrder $ PartialComparable
- 为什么Kotlin中的'as'并没有在这种情况下施展
- 从Java访问Kotlin扩展function
- Kotlin代码如何在Android应用程序中执行,与Java有什么不同?
- Kotlin:泛化的泛型似乎不适用于hash / equals比较
- Java斐波那契数列BigInteger
- Android微调不响应点击,不关闭和OnItemSelectedListener不会触发
- 如何将java.util.stream.Stream 转换成kotlin.Sequence