Kotlin抽象方法与身体

时间:2017-10-01 12:03:29

标签: interface kotlin abstract

提到here:如果接口中的函数没有正文,则默认为抽象。但是界面的功能与身体没有任何关系。

示例:

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()

如何使用已定义主体的方法是抽象的?

1 个答案:

答案 0 :(得分:7)

这与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选项)找到所有这些详细信息。