在Kotlin中调用操作符&运算符重载
我开始了解Invoke操作符,
a()
相当于a.invoke()
有什么更多关于调用操作员,然后请解释。 此外,我没有得到任何Invoke运算符重载的例子。
调用操作符是否可以重载? 如果可能的话,任何人都可以请示例解释有关Invoke操作符重载。 我没有得到任何关于这个。
提前致谢。
是的,你可以重载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
使用调用操作符的最多方式是将其用作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)
这是因为伴侣对象是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) } }