В Kotlin методы интерфейса с телами по умолчанию компилируются следующим образом:
// kotlin
interface B {
fun optional() { println("B optional body") }
}
примерно скомпилирован в:
public interface B {
void optional();
public static final class DefaultImpls {
public static void optional(B $this) {
System.out.println("B optional body");
}
}
}
Затем в классах Kotlin, реализующих этот интерфейс,компилятор автоматически добавляет переопределение для метода optional
и вызывает B.DefaultImpls.optional(this)
.
public final class KA implements B {
public void optional() {
B.DefaultImpls.optional(this);
}
}
Но что если вы захотите реализовать этот интерфейс в Java и избежать необходимости переопределять метод optional
и вызывать B.DefaultImpls
вручную? В этом случае вы можете использовать экспериментальную @JvmDefault
функцию .
Во-первых, вам нужно включить пару опций компилятора:
- целевая версия байт-кода JVM1.8 или выше:
-jvm-target 1.8
- включить методы JVM по умолчанию:
-Xjvm-default=enable
(см. Другие доступные значения параметров по ссылке выше)
Затем вы аннотируете метод optional
с аннотацией @JvmDefault
:
// kotlin
interface B {
@JvmDefault
fun optional() { println("B optional body") }
}
и она компилируется в
public interface B {
@JvmDefault
default void optional() {
System.out.println("B optional body");
}
}
И теперь реализация этого интерфейса на Java становится просто:
public final class A implements B {
}