升级到kotlin RC1后的java.lang.IncompatibleClassChangeError(1.0.0-rc-1036)

时间:2016-02-05 09:20:39

标签: android kotlin

升级到kotlin RC1(1.0.0-rc-1036)后,我收到此错误:

  

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

我在我的一个班级中使用 lazy

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

来自release notes

  

Lazy现在是一个可以实现的界面

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

1 个答案:

答案 0 :(得分:2)

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

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

如果在运行时从前RC标准库中加载Lazy,它就会成为一个类,而不是一个接口。这是JVM捕获不一致性并抛出IncompatibleClassChangeError

的地方

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

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