@JvmDefault и как добавить опцию компилятора - PullRequest
0 голосов
/ 28 декабря 2018

Мне нужно сделать default void метод в интерфейсе Kotlin.Я столкнулся с проблемой, и подсказка сказала: Использование @JvmDefault разрешено только с -Xjvm-default option .

Куда мне нужно написать это Xjvm-default?

Ответы [ 2 ]

0 голосов
/ 29 декабря 2018

Этот вопрос относительно @JvmDefault кажется довольно похожим на этот вопрос .

Флаг -Xjvm-default=enable должен быть передан компилятору .Так как я предполагаю, что вы не работаете с kotlinc (компилятором Kotlin) непосредственно в командной строке: Этот Q & A содержит информацию о том, как передавать флаги компилятору Kotlin, когдаиспользуя Gradle.

0 голосов
/ 29 декабря 2018

@Target([AnnotationTarget.FUNCTION, AnnotationTarget.PROPERTY]) класс аннотаций JvmDefault

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

Использование этой аннотации требует явногонеобходимо указать аргумент компиляции: -Xjvm-default=enable или -Xjvm-default=compatibility.

с -Xjvm-default=enable, для каждого метода @JvmDefault создается только метод по умолчанию в интерфейсе.В этом режиме аннотирование существующего метода с помощью @JvmDefault может нарушить бинарную совместимость, поскольку оно будет эффективно удалять метод из класса DefaultImpls.

с помощью -Xjvm-default=compatibility, в дополнение к методу интерфейса по умолчанию,средство доступа совместимости генерируется в классе DefaultImpls, который вызывает метод интерфейса по умолчанию через искусственный метод доступа.В этом режиме аннотирование существующего метода с помощью @JvmDefault совместимо с двоичным кодом, но приводит к увеличению числа методов в байт-коде.

Удаление этой аннотации из элемента интерфейса является двоичным несовместимым изменением в обоих режимах.

Генерация методов по умолчанию возможна только с целевым байт-кодом JVM версии 1.8 (-jvm-target 1.8) или выше.

@JvmDefault методы исключены из делегирования интерфейса.

https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.jvm/-jvm-default/index.html

если вы используете gradle, добавьте этот параметр в скрипт gradle

https://kotlinlang.org/docs/reference/using-gradle.html

например добавьте его в gradle:

kotlinOptions {
    freeCompilerArgs = ['-Xjvm-default=compatibility']
}

в противном случаеесли вы используете компилятор командной строки Kotlinc, добавьте -Xjvm-default=compatibility после вашей команды в командной строке

...