【问题标题】:java.lang.IncompatibleClassChangeError after upgrading to kotlin RC1 (1.0.0-rc-1036)升级到 kotlin RC1 (1.0.0-rc-1036) 后的 java.lang.IncompatibleClassChangeError
【发布时间】:2016-02-05 09:20:38
【问题描述】:

升级到 kotlin RC1 (1.0.0-rc-1036) 后,出现以下错误:

java.lang.IncompatibleClassChangeError:方法“java.lang.Object kotlin.Lazy.getValue()”应为接口类型,但发现为虚拟类型(“java.lang.reflect”的声明.ArtMethod' 出现在 /system/framework/core-libart.jar)

我在我的一堂课中使用 lazy

 val api by lazy {
        val client = OkHttpClient()
        ...
}

来自release notes

Lazy 现在是一个开放实现的接口

但我无法弄清楚我必须更改什么才能让我的代码再次运行...

【问题讨论】:

  • 似乎您已经使用新编译器编译了代码,但在类路径中使用旧的 kotlin 运行时运行它。
  • 如果您使用的是 gradle 或 maven 等构建系统,请发布您的配置。如果没有在你的 lib 文件夹中检查 kotlin-stdlib-1.0.0-rc-1036.jar

标签: android kotlin


【解决方案1】:

当针对标准库kotlin-stdlib-1.0.0-rc-1036.jar 编译代码时,编译器将Lazy 视为接口并生成INVOKEINTERFACE 指令以获取其属性的值:

INVOKEINTERFACE kotlin/Lazy.getValue ()Ljava/lang/Object;

如果在运行时你从 pre-RC 标准库中加载了Lazy,它恰好是一个类而不是一个接口。这是 JVM 捕获这种不一致并抛出 IncompatibleClassChangeError 的地方。

因此,您需要确保在运行时没有可用于类加载器的旧标准库。

如果您使用 Gradle,请按照 https://kotlinlang.org/docs/reference/using-gradle.html#configuring-dependencies 的说明配置/更新对标准库的依赖。

【讨论】:

    猜你喜欢
    • 2021-11-05
    • 2017-01-29
    • 2016-05-19
    • 1970-01-01
    • 2013-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多