Kotlin的扩展功能如何运作?

时间:2017-09-22 10:08:59

标签: scala compilation kotlin implicit kotlin-extension

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

科特林

fun Int.square() = this * this

用法:

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

DOC:

  

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

     

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

我的期望是他们只是在编译期间将它添加到扩展类的成员函数中,但这是他们明确拒绝的,所以我的下一个想法是它可能是"有点&# 34;像scala implicits。

Scala的

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

用法:

import IntExtensions._

然后

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

DOC:

  

隐式类被置于类和隐式方法配对中,其中implciit方法模仿类的构造函数。

     

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

但是scala暗示会创建一个新类,这会禁用this的使用。

那么...... Kotlin如何扩展课程? "可赎回"并没有告诉我多少。

1 个答案:

答案 0 :(得分:4)

在你的情况下,Kotlin只需创建名为“filename”Kt 的简单utils-class和静态方法“ 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);

P.S。 您可以使用IDEA操作“显示Kotlin字节码”

自行查看