@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
методы исключены из делегирования интерфейса.
в противном случаеесли вы используете компилятор командной строки Kotlinc, добавьте -Xjvm-default=compatibility
после вашей команды в командной строке