【问题标题】:How do Kotlin's extension functions work?Kotlin 的扩展函数是如何工作的?
【发布时间】:2017-09-22 10:08:58
【问题描述】:

假设我想要一个提供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 扩展类是怎么回事? “使可调用”并没有告诉我太多。

【问题讨论】:

    标签: scala compilation kotlin implicit kotlin-extension


    【解决方案1】:

    在您的情况下,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()

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

    val 结果 = IntUtilsKt.square(20);

    附: 您可以使用 IDEA 操作“显示 Kotlin 字节码”自己查看它

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-03
      • 2023-02-04
      相关资源
      最近更新 更多