Как использовать функцию Java 8 метода по умолчанию в интерфейсе, написанном на Kotlin - PullRequest
0 голосов
/ 06 ноября 2019

У меня есть класс A в Java и интерфейс B в Kotlin.

// kotlin
interface B {
    fun optional()
}
// java
class A implements B {
}

Я хочу написать метод по умолчанию (функция Java 8) в интерфейсе Kotlin (B) и хочу реализоватьэто в классе А. Как я могу достичь этого?

Заранее спасибо.

Ответы [ 2 ]

1 голос
/ 06 ноября 2019

Пока существуют другие классы, кроме A, реализующие B, это может иметь смысл. В противном случае вам либо не понадобится реализация по умолчанию, либо вам не нужно будет реализовывать этот метод в классе реализации.

Однако вы можете сделать это следующим образом:

interface B {
    fun optional() { print("optional") }
}

class A implements B {
    override fun optional() { print("B's optional") }
}
0 голосов
/ 07 ноября 2019

В 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 {
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...