从Kotlin的另一个类访问静态扩展函数?

时间:2017-06-10 17:56:44

标签: android kotlin extension-function

假设我们有以下扩展功能:

class Helper {
  companion object {
    fun Int.plus(value: String) = Integer.valueOf(value).plus(this)
  }

}

如何从另一个类的plus类中访问Helper扩展函数。有没有办法我们可以做这样的事情,例如:

class OtherClass {
  fun someMethod() {
    val eight = 7.Helper.Companion.plus("1")
  }

}

2 个答案:

答案 0 :(得分:3)

在您的示例中,Int.plus(value: String)Helper.Companion对象的成员函数(事实上它是一个伴随对象,或者它在另一个类中并不重要)。此案例在文档的Declaring Extensions as Members部分中进行了描述。

简而言之,要使用两个接收器(类型为Int的扩展接收器和类型为Helper.Companion的调度接收器)访问一个函数,您必须同时使用它们范围。

这可以通过多种方式实现:

with(Helper.Companion) {
    239.plus("")
}

with(Helper.Companion) {
    with(239) {
        plus("")
    }
}

P.S。将扩展函数放入伴随对象是非常不规则的,而不是惯用的。我很难想象你为什么需要那个。

答案 1 :(得分:1)

声明为此类的扩展名为member extension function,并且只会在Helper类中显示。如果您需要在该类之外访问它,请将其放在更广泛的范围内,例如,使其成为顶级函数。或者,如果要将其保留在类中,可以使它成为带有两个参数的常规函数​​。

作为附加提示,如果您要将此功能与+符号一起使用,则可以将此功能标记为operator

operator fun Int.plus(value: String) = Integer.valueOf(value) + this

val x = 2 + "25"