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字节码”