2016-02-05 2 views
1

После обновления до Котлин RC1 (1.0.0-RC-1036), я получаю эту ошибку:java.lang.IncompatibleClassChangeError после обновления до Котлин RC1 (1.0.0-RC-1036)

java.lang.IncompatibleClassChangeError: The method 'java.lang.Object kotlin.Lazy.getValue()' was expected to be of type interface but instead was found to be of type virtual (declaration of 'java.lang.reflect.ArtMethod' appears in /system/framework/core-libart.jar)

I использовать в одном из моего класса ленивый:

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

от release notes:

Lazy is now an interface open for implementation

Но я не могу понять, что я должен изменить, чтобы получить мой код работает снова ...

+1

Кажется, что вы скомпилировали код с новым компилятором, но запустили его со старым временем выполнения kotlin в пути к классам. – Ilya

+0

Если вы используете систему сборки, такую ​​как gradle или maven, отправьте конфигурацию. Если вы не зарегистрировали свою папку lib для 'kotlin-stdlib-1.0.0-rc-1036.jar' – omainegra

ответ

2

Когда код компилируется против стандартной библиотеки kotlin-stdlib-1.0.0-rc-1036.jar компилятор видит Lazy быть интерфейс и генерирует INVOKEINTERFACE команду, чтобы получить значение его свойства:

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

в случае, если во время выполнения вы получите Lazy загруженные из стандартной библиотеки предварительно RC это происходит, чтобы быть классом, а не интерфейс. Здесь JVM ловит эту несогласованность и бросает IncompatibleClassChangeError.

Итак, вы должны убедиться, что у вас нет старой стандартной библиотеки, доступной для загрузчика классов во время выполнения.

Если вы используете Gradle, следуйте инструкциям на странице https://kotlinlang.org/docs/reference/using-gradle.html#configuring-dependencies, чтобы настроить/обновить зависимость от стандартной библиотеки.

Смежные вопросы