2017-07-18 33 views
0

に過負荷私はもっと説明してくださいその後、オペレータを起動に関するものがありますは、Invoke演算子&演算子はKotlin

a()a.invoke()

に相当し、呼び出し演算子を知ってもらいます。また、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ライブラリクラスの拡張機能としても優れています。

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

そしてそう

​​ようにそれを使用します。たとえば、次のJavaクラスにKotlinで

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

を持って

を言って、あなたはそうのようなThingParserの拡張子を定義することができます

+0

2番目の例をもっと丁寧に説明してください。 –

+0

確かに、それについて何か教えていただければ、あなたは精巧にしたいと思います。特に意味をなさない部分はありますか? –

+0

2番目のプログラムをもっと丁寧に説明してください。 –

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

ありがとうございます。 –

+0

@AvijitKarmakar全くありません。それは私の喜びです:) –

+0

なぜ、名前付きのデフォルト値をパラメータとして使用しませんか? – Antek