2017-07-18 64 views
0

我更多地瞭解了調用操作員,調用操作和運算符重載在科特林

a()相當於a.invoke()

有什麼更多關於調用操作,然後請解釋。另外,我沒有得到任何Invoke運算符重載的例子。

是否可以調用操作符重載?如果可能的話,任何人都可以請一個例子解釋關於Invoke操作符重載。我對此沒有得到任何答案。

在此先感謝。

回答

5

是的,你可以重載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) 

並使用它像這樣

​​
+0

你能否更詳細地解釋第二個例子。 –

+0

當然,如果你能告訴我你想要做些什麼。有沒有什麼特別的部分是沒有意義的? –

+0

只需更詳細地解釋第二個程序。 –

3

使用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) 
    } 
} 
+0

感謝您的幫助。 –

+0

@AvijitKarmakar一點都沒有。這是我的榮幸,:) –

+0

爲什麼不使用命名默認值的參數? – Antek