调用操作员& Kotlin中的运算符重载

时间:2017-07-18 17:41:34

标签: operator-overloading kotlin

我了解了Invoke运算符,

a()相当于a.invoke()

还有关于Invoke运算符的更多信息请解释。另外,我没有得到任何Invoke运算符重载的例子。

Invoke运算符重载是否可行?如果可能的话,任何人都可以通过一个例子来解释Invoke运算符重载。我对此没有任何意见。

提前致谢。

3 个答案:

答案 0 :(得分:11)

是的,您可以重载invoke。这是一个例子:

class Greeter(val greeting: String) {
    operator fun invoke(target: String) = println("$greeting $target!")
}

val hello = Greeter("Hello")
hello("world")  // Prints "Hello world!"

除了@ holi-java所说的,覆盖invoke对于任何有明确动作的类都是有用的,可选择带参数。它也可以作为Java库类的扩展函数使用这种方法。

例如,假设您有以下Java类

public class ThingParser {
    public Thing parse(File file) {
        // Parse the file
    }
}

在Kotlin中,你可以在ThingParser上定义一个扩展名,如下所示:

operator fun ThingParser.invoke(file: File) = parse(file)

并像这样使用

val parser = ThingParser()
val file = File("path/to/file")
val thing = parser(file)  // Calls Parser.invoke extension function

答案 1 :(得分:5)

使用invoke运算符的最常用方法是将其用作Factory Method,例如:

//          v--- call the invoke(String) operator 
val data1 = Data("1")

//            v--- call the invoke() operator 
val default = Data()

//          v-- call the constructor
val data2 = Data(2)

这是因为companion object是Kotlin中的一个特殊对象。实际上,上面的代码Data("1")被转换为如下代码:

val factory:Data.Companion = Data

//                       v-- the invoke operator is used here
val data1:Data = factory.invoke("1")
class Data(val value: Int) {

    companion object {
        const val DEFAULT =-1
        //           v--- factory method
        operator fun invoke(value: String): Data = Data(value.toInt())

        //           v--- overloading invoke operator
        operator fun invoke(): Data = Data(DEFAULT)
    }
}

答案 2 :(得分:0)

如果您有一些Python背景,

您可以将Kotlin中的invoke视为Python中的__call__

使用此功能,您可以“调用”对象,就好像它是一个函数一样。

一个区别是:您可以重载invoke,但是没有正式的方法可以重载Python中的方法。