使用从Kotlin数据类生成的代码时出现“不兼容类型”错误
发布时间:2020-12-15 00:47:57 所属栏目:Java 来源:网络整理
导读:如果我反编译由数据类State生成的.class文件(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 ListInteger
如果我反编译由数据类State生成的.class文件(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; } // ... } 如果我将这个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通配符”下描述为here. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |