Kotlin的扩展功能如何工作?

比方说,我想要一个整数,提供一个square方法。

Kotlin

 fun Int.square() = this * this 

用法:

 println("${20.square()}") 

DOC:

扩展实际上并不修改它们扩展的类。 通过定义扩展,不要将新成员插入到类中,而只需使用这种类型的变量的点符号来调用新函数。

我们要强调的是,扩展功能是静态调度的

我的期望是,他们只是在编译期间将它添加到扩展类的成员函数中,但这是他们明确否定的,所以我的下一个想法是它可以像“scala implicits”那样“排序”。

斯卡拉

 object IntExtensions{ implicit Class SquareableInt(i:Int){ def square = i*i } } 

用法:

 import IntExtensions._ 

接着

 println(f"${20.square}") 

DOC:

一个隐式类被剥离成一个类和隐式方法配对,其中implciit方法模仿类的构造函数。

生成的隐式方法将具有与隐式类相同的名称。

但是,斯卡拉暗示创建一个新的类,这将禁用这个使用。

那么… Kotlin如何扩展类呢? “打电话”并没有多大的意义。

在你的情况下,Kotlin只需创建名称为“文件名”Kt的简单实用程序类和静态方法“ int square(int x) ”(java伪代码)

从Java看起来像这样

 // filename int-utils.kt final class IntUtilsKt { public static int square(int x) { return x * x; } } 

在这之后所有的电话

  val result = 20.square() 

将被转换(在字节码级别)为

  val result = IntUtilsKt.square(20); 

PS您可以使用IDEA操作“显示Kotlin字节码”