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

Posted

技术标签:

【中文标题】使用从 Kotlin 数据类生成的代码时出现“不兼容的类型”错误【英文标题】:Getting "Incompatible types" error when using code generated from a Kotlin data class 【发布时间】:2016-04-18 03:39:16 【问题描述】:

如果我反编译 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 生成的代码如何能够做到这一点,但我的复制/粘贴版本却不行?

【问题讨论】:

你使用的是什么 Kotlin 版本? 【参考方案1】:

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

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

更一般地说,我们的目标是确保用 Kotlin 编写的 API 易于从 Java 代码中使用,为了实现这一点,Kotlin 允许您控制它生成通配符的确切位置。这在“Java 通配符”下的 here 进行了描述。

【讨论】:

以上是关于使用从 Kotlin 数据类生成的代码时出现“不兼容的类型”错误的主要内容,如果未能解决你的问题,请参考以下文章

将 Qute TypeSafe 模板与 Kotlin 一起使用时出现 java.lang.UnsatisfiedLinkError

将 Kotlin 属性委托与 by 一起使用时出现 NullPointerException (NPE)

从 Kotlin 调用 JJWT 时出现 NoMethodError

使用 Jenkins 构建 APK 时出现 kotlin.KotlinNullPointerException(无错误消息)

从 Kotlin 实现 Java 接口时出现 NullPointerException

尝试从 Kotlin 中的另一个活动访问 EditText 时出现空指针异常