升级到kotlin RC1(1.0.0-rc-1036)之后的java.lang.IncompatibleClassChangeError
升级到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中)
我在我的一个班里使用懒惰 :
val api by lazy { val client = OkHttpClient() ... }
从发行说明 :
懒惰现在是一个开放的接口实现
但我不知道我必须改变,让我的代码再次运行…
当代码被编译为标准库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中的说明配置/更新标准库的依赖关系。