2

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

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")
  }

}

4

2 回答 2

5

在您的示例Int.plus(value: String)中是Helper.Companion对象的成员函数(它是伴生对象或它在另一个类中的事实并不重要)。这种情况在文档的将扩展声明为成员部分中进行了描述。

简而言之,要访问具有两个接收器(类型的扩展接收器和类型Int的调度接收器Helper.Companion)的函数,您必须将它们都放在作用域中。

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

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

或者

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

PS 将扩展函数放入伴生对象中是非常不规则且不惯用的。我很难想象你为什么需要那个。

于 2017-06-10T18:26:19.350 回答
2

像这样声明的扩展是member extension function, 并且只会在Helper类中可见。如果您需要在该类之外访问它,请将其放在更广泛的范围内,例如,使其成为顶级函数。或者,如果您想将其保留在一个类中,您可以将其设为接受两个参数的常规函数​​。


作为附加提示,operator如果您想将此函数与+符号一起使用,可以将其标记为:

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

val x = 2 + "25"
于 2017-06-10T18:03:47.133 回答