我更多地瞭解了調用操作員,調用操作和運算符重載在科特林
a()
相當於a.invoke()
有什麼更多關於調用操作,然後請解釋。另外,我沒有得到任何Invoke運算符重載的例子。
是否可以調用操作符重載?如果可能的話,任何人都可以請一個例子解釋關於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!"
除了什麼@灑紅節的Java說,覆蓋invoke
那裏有一個明確的行動,以可選參數爲任何類有用。用這種方法作爲Java庫類的擴展函數也很好。
例如,假設你有下面的Java類
public class ThingParser {
public Thing parse(File file) {
// Parse the file
}
}
在科特林,您可以ThingParser定義一個擴展,像這樣:
operator fun ThingParser.invoke(file: File) = parse(file)
並使用它像這樣
使用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在科特林的特殊對象。事實上,上面的代碼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)
}
}
你能否更詳細地解釋第二個例子。 –
當然,如果你能告訴我你想要做些什麼。有沒有什麼特別的部分是沒有意義的? –
只需更詳細地解釋第二個程序。 –