首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Kotlin编写的界面中使用默认方法的Java 8特性

如何在Kotlin编写的界面中使用默认方法的Java 8特性
EN

Stack Overflow用户
提问于 2019-11-06 19:35:34
回答 2查看 1.7K关注 0票数 2

我在java中有一个类A,在Kotlin中有一个接口B。

代码语言:javascript
复制
// kotlin
interface B {
    fun optional()
}
代码语言:javascript
复制
// java
class A implements B {
}

我想在Kotlin接口(B)中编写默认方法(Java 8特性),并想在类A中实现它,我该如何实现它?

提前谢谢。

EN

回答 2

Stack Overflow用户

发布于 2019-11-07 09:50:43

在Kotlin中,带有by的接口方法默认编译如下:

代码语言:javascript
复制
// kotlin
interface B {
    fun optional() { println("B optional body") }
}

粗略地编译为:

代码语言:javascript
复制
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)

代码语言:javascript
复制
public final class KA implements B {
   public void optional() {
      B.DefaultImpls.optional(this);
   }
}

但是,如果您想用Java语言实现此接口,并避免必须覆盖optional方法和手动调用B.DefaultImpls,该怎么办呢?在这种情况下,您可以使用the experimental @JvmDefault feature

首先,您需要启用几个编译器选项:

JVM目标字节码版本1.8或更高版本:-jvm-target 1.8

  • enable

  • 默认方法:-Xjvm-default=enable (通过上面的链接查看其他可用的选项值)

然后,使用@JvmDefault注释来注释optional方法:

代码语言:javascript
复制
// kotlin
interface B {
    @JvmDefault
    fun optional() { println("B optional body") }
}

并将其编译为

代码语言:javascript
复制
public interface B {
   @JvmDefault
   default void optional() {
      System.out.println("B optional body");
   }
}

现在这个接口的Java实现变成了:

代码语言:javascript
复制
public final class A implements B {
}
票数 5
EN

Stack Overflow用户

发布于 2019-11-06 19:47:25

只要除了A之外还有实现B的其他类,这可能是有意义的。否则,您要么不需要默认实现,要么不必在实现类中实现该方法。

但是,您可以这样做:

代码语言:javascript
复制
interface B {
    fun optional() { print("optional") }
}

class A implements B {
    override fun optional() { print("B's optional") }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58729265

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档