Kotlin interface default method

Kotlin interface default method

前言

java 在 1.8 之前,interface 是没有默认方法的。但是 kotlin 是支持在接口中定义一个默认方法的。那么 kotlin 是怎么实现的呢?本文将带你一探究竟。

Show me the code


interface TestInterface {
    fun method1() {
        println("default impl for method1() called")
    }

    fun method2()
}

class TestInterfaceCaller {
    fun getTestInterfaceImpl(): TestInterface {
        return object : TestInterface {
            override fun method2() {
                println("method2 called")
            }
        }
    }
}

如代码所示,我们定义了一个简单的 interface 叫 TestInterface,然后在里面有两个方法:method1 和 method2 。其中,method1 是默认方法,提供了一个默认实现。然后,在使用方,也就是 TestInterfaceCaller 中,返回了一个 object : TestInterface对象。这个对象就相当于 java 中的匿名内部类。然后,我们发现,ide 要求我们必须要实现 method2 方法,而 method1 方法不用实现。这符合我们的直观认知:因为 method1 方法是当做一个接口的默认方法来用的,method2 方法是一个接口的普通方法,所有实现这个接口的对象都要实现这个 method2 方法。

kotlin 怎么实现的?源码面前,了无秘密。

kotlin 是怎么实现 interface 默认方法的呢?要知道 java1.8 才实现的功能,kotlin 其实不要求版本就能实现。jvm 又不可能针对 kotlin 来单独开一个后门。要想知道 kotlin 是怎么实现的,我们需要对相关代码做一个反编译。结果如下:

public interface TestInterface {
   void method1();

   void method2();

   public static final class DefaultImpls {
      public static void method1(TestInterface $this) {
         String var1 = "default impl for method1() called";
         boolean var2 = false;
         System.out.println(var1);
      }
   }
}
public final class TestInterfaceCaller {
   @NotNull
   public final TestInterface getTestInterfaceImpl() {
      return (TestInterface)(new TestInterface() {
         public void method2() {
            String var1 = "method2 called";
            boolean var2 = false;
            System.out.println(var1);
         }

         public void method1() {
            TestInterface.DefaultImpls.method1(this);
         }
      });
   }
}

源码面前,了无秘密。我们可以看到,对于 interface 中的默认方法 method1,kotlin 其实有一个 trick:在编译期间会生成一个 DefaultImpls 的静态类,在里面有 method1 的实现。而在使用方,会在编译期间进行替换,把未实现的方法实现为对 DefaultImpls 中的静态方法的调用。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 写在开头:本人打算开始写一个Kotlin系列的教程,一是使自己记忆和理解的更加深刻,二是可以分享给同样想学习Kot...
    胡奚冰阅读 1,455评论 5 11
  • Kotlin的类和接口与Java的类和接口是有一定的区别的。Kotlin的接口是可以包含属性声明。Kotlin默认...
    程自舟阅读 10,431评论 0 11
  • 面向对象编程(OOP) 在前面的章节中,我们学习了Kotlin的语言基础知识、类型系统、集合类以及泛型相关的知识。...
    Tenderness4阅读 4,510评论 1 6
  • 简述: 从这篇文章将继续开始探索Kotlin中的一些高级的内容,之前有着重探讨了Kotlin的泛型以及泛型型变等内...
    熊喵先森阅读 6,157评论 1 8
  • @高一慧@周君[拥抱][拥抱]好多人都还没睡啊, 今天怎么 怎么 都睡不着 一次次 重复听着《九儿》 这首歌曲 自...
    福娃婧阅读 185评论 0 0