升级到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()
...
}
Lazy现在是一个可以实现的界面
但我无法弄清楚我必须改变什么才能让我的代码再次运行......
答案 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上的说明配置/更新标准库的依赖关系。