Kotlin与身体的抽象方法

如上所述:如果接口中的函数没有主体,则默认为抽象。 但是接口的功能与身体无关。

例:

interface MyInterface { fun foo() { print("Something") } fun bar() } fun main(args: Array<String>) { println(MyInterface::foo.javaMethod) println(MyInterface::bar.javaMethod) } 

输出将是:

 public abstract void MyInterface.foo() public abstract void MyInterface.bar() 

如何可能,具有定义身体的方法是抽象的?

这与Kotlin接口中默认方法的实现方式有关。 你的界面中的foobar方法都是抽象的。

然而,在界面里面有一个内部类,看起来像这样(简化):

 public interface MyInterface { void foo(); void bar(); public static final class DefaultImpls { public static void foo() { System.out.print("Something"); } } } 

这个类是包含你在界面内部赋予主体的任何函数的默认实现的类。

然后,如果你创建了一个实现这个接口的类,并且你不重写foo方法:

 class MyClass: MyInterface { override fun bar() { println("MyClass") } } 

然后你得到一个自动生成的,这只是调用DefaultImpls内的实现:

 public final class MyClass implements MyInterface { public void bar() { System.out.println("MyClass"); } public void foo() { MyInterface.DefaultImpls.foo(); } } 

您可以使用Kotlin插件附带的字节码查看器( Tools -> Kotlin -> Show Kotlin Bytecode ,然后是Decompile选项)来查找所有这些详细信息。