我了解了Invoke运算符,
a()
相当于a.invoke()
还有关于Invoke运算符的更多信息请解释。另外,我没有得到任何Invoke运算符重载的例子。
Invoke运算符重载是否可行?如果可能的话,任何人都可以通过一个例子来解释Invoke运算符重载。我对此没有任何意见。
提前致谢。
答案 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中的方法。