升级到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中的说明配置/更新标准库的依赖关系。