如何在Kotlin编写的接口中使用默认方法的Java8特性

如何在Kotlin编写的接口中使用默认方法的Java8特性,java,kotlin,java-8,interface,default-method,Java,Kotlin,Java 8,Interface,Default Method,我在java中有一个类a,在Kotlin中有一个接口B //科特林 接口B{ 趣味选修课 } //爪哇 A类实现B类{ } 我想在Kotlin接口B中编写默认的方法Java8特性,并想在类A中实现它。 我怎样才能做到呢 提前感谢。只要有实现B的A以外的其他类,这可能是有意义的。否则,您要么不需要默认实现,要么不必在实现类中实现该方法 但是,您可以这样做: 接口B{ 趣味可选{printoptional} } A类实现B类{ 覆盖乐趣可选{printB的可选} } 只要存在实现B的A以外的其他类,

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

//科特林 接口B{ 趣味选修课 } //爪哇 A类实现B类{ } 我想在Kotlin接口B中编写默认的方法Java8特性,并想在类A中实现它。 我怎样才能做到呢


提前感谢。

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

但是,您可以这样做:

接口B{ 趣味可选{printoptional} } A类实现B类{ 覆盖乐趣可选{printB的可选} }
只要存在实现B的A以外的其他类,这可能是有意义的。否则,您要么不需要默认实现,要么不必在实现类中实现该方法

但是,您可以这样做:

接口B{ 趣味可选{printoptional} } A类实现B类{ 覆盖乐趣可选{printB的可选} }
在Kotlin中,带有主体的接口方法默认编译如下:

//科特林 接口B{ 趣味可选{printlnB可选正文} } 大致编译为:

公共接口B{ 无效可选; 公共静态最终类DefaultImpls{ 公共静态无效选项B$this{ System.out.printlnB可选主体; } } } 然后,在实现该接口的Kotlin类中,编译器会自动为可选方法添加一个覆盖,并在那里调用B.DefaultImpls.optionalthis

公共期末班{ 公共无效可选{ B.默认情况下,可选择此选项; } } 但是,如果您想在Java中实现这个接口,并避免重写可选方法和手动调用B.DefaultImpls,该怎么办?在这种情况下,你可以使用

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

JVM目标字节码版本1.8或更高版本:-JVM目标1.8 enable JVM default methods:-Xjvm default=enable通过上面的链接查看其他可用选项值 然后,用@JvmDefault注释可选方法:

// kotlin
interface B {
    @JvmDefault
    fun optional() { println("B optional body") }
}
它被编译成

公共接口B{ @JVM默认值 默认无效可选{ System.out.printlnB可选主体; } } 现在这个接口的Java实现变成了:

公共最终类A实现B{ }
在Kotlin中,带有主体的接口方法默认编译如下:

//科特林 接口B{ 趣味可选{printlnB可选正文} } 大致编译为:

公共接口B{ 无效可选; 公共静态最终类DefaultImpls{ 公共静态无效选项B$this{ System.out.printlnB可选主体; } } } 然后,在实现该接口的Kotlin类中,编译器会自动为可选方法添加一个覆盖,并在那里调用B.DefaultImpls.optionalthis

公共期末班{ 公共无效可选{ B.默认情况下,可选择此选项; } } 但是,如果您想在Java中实现这个接口,并避免重写可选方法和手动调用B.DefaultImpls,该怎么办?在这种情况下,你可以使用

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

JVM目标字节码版本1.8或更高版本:-JVM目标1.8 enable JVM default methods:-Xjvm default=enable通过上面的链接查看其他可用选项值 然后,用@JvmDefault注释可选方法:

// kotlin
interface B {
    @JvmDefault
    fun optional() { println("B optional body") }
}
它被编译成

公共接口B{ @JVM默认值 默认无效可选{ System.out.printlnB可选主体; } } 现在这个接口的Java实现变成了:

公共最终类A实现B{ }
如果您已经在类中实现了它,为什么要将其添加为默认方法?这是没有意义的。Kotlin中没有默认关键字,您可以只提供一个方法体,该方法体将是默认的。默认方法将在接口中实现。。但可以进一步重写。@Naman是的,但不只是这样。它们并不是真的要添加到新接口,而是要在不破坏向后兼容性的情况下向旧接口添加新功能。如果您已经在类中实现了它,为什么要将其作为默认方法添加?这是没有意义的。Kotlin中没有默认关键字,您可以只提供一个方法体,该方法体将是默认的。默认方法将在接口中实现。。但可以进一步重写。@Naman是的,但不只是这样。它们并不是真的要添加到新接口,而是要在不破坏向后兼容性的情况下向旧接口添加新功能。我可以知道在哪里添加启用此JVM默认方法:-Xjvm默认方法吗=enable@sharma.mahesh这是一个命令行选项
uld传递给编译器。在Gradle中,这可以通过将其添加到Kotlinoctions.freeCompilerArgs列表中来实现。有关指定kotlinOptions的Android示例,请参阅此问题及其答案。我是否可以知道在何处添加enable this JVM default methods:-Xjvm default=enable@sharma.mahesh这是一个应该传递给编译器的命令行选项。在Gradle中,这可以通过将其添加到Kotlinoctions.freeCompilerArgs列表中来实现。有关指定kotlinOptions的Android示例,请参见此问题及其答案