1

假设我想要一个提供square方法的整数。

科特林

fun Int.square() = this * this

用法:

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

文档:

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

我们想强调的是扩展函数是静态调度的

我的期望是他们只是在编译期间将它添加到扩展类的成员函数中,但这是他们明确否认的,所以我的下一个想法是它可能“有点”像 scala 隐式。

斯卡拉

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

用法:

import IntExtensions._

进而

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

文档:

隐式类被分解为类和隐式方法配对,其中隐式方法模仿类的构造函数。

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

但是 scala 隐式创建了一个新类,这将禁用this.

那么...... Kotlin 是如何扩展类的呢?“使可调用”并没有告诉我太多。

4

1 回答 1

6

在您的情况下,Kotlin 只需创建名称为“filename”Kt和静态方法“ int square(int x) ”的简单 utils 类(java 伪代码)

从Java看起来像这样

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

在这之后所有的呼吁

val 结果 = 20.square()

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

验证结果 = IntUtilsKt.square(20);

PS您可以使用IDEA操作“Show Kotlin byte-code”自己查看

于 2017-09-22T10:30:01.313 回答