2017-09-22 99 views
1

比方说,我想要一个整数,提供square方法。Kotlin的扩展函数如何工作?

科特林

fun Int.square() = this * this 

用法:

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

DOC:

扩展实际上没有修改他们扩展类。通过定义一个扩展,你不需要在类中插入新的成员,而只需要使用这种类型的变量的点符号来调用新的函数。

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

我预计会一直认为他们只是在编译期间将其添加到扩展的类的成员函数,但是这是他们明确拒绝,所以我的下一个想法是,它可能是“有点”像斯卡拉implicits。

的Scala

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

用法:

import IntExtensions._ 

然后

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

DOC:

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

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

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

那么... Kotlin如何扩展类? “打个招呼”并没有给我太多的提示。

回答

4

在你的情况科特林只是创建简单的utils的类名称为“文件名”千吨和静态方法“INT方(INT X)”(Java的伪代码)

从Java它看起来这样

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

并在此之后的所有来电

val result = 20.square()

将TRANSF (在字节码级上)到

val result = IntUtilsKt.square(20);

P.S. 您可以使用IDEA动作“显示Kotlin字节码”自己查看它