に過負荷私はもっと説明してくださいその後、オペレータを起動に関するものがありますは、Invoke演算子&演算子はKotlin
a()
a.invoke()
に相当し、呼び出し演算子を知ってもらいます。また、Invoke演算子のオーバーロードの例はありませんでした。
Invokeオペレータのオーバーロードは可能ですか?可能であれば、誰でもInvoke演算子のオーバーロードについて例を挙げて説明してください。私はこれについて何も得られなかった。
ありがとうございます。
に過負荷私はもっと説明してくださいその後、オペレータを起動に関するものがありますは、Invoke演算子&演算子はKotlin
a()
a.invoke()
に相当し、呼び出し演算子を知ってもらいます。また、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ライブラリクラスの拡張機能としても優れています。
operator fun ThingParser.invoke(file: File) = parse(file)
そしてそう
ようにそれを使用します。たとえば、次のJavaクラスにKotlinでpublic class ThingParser {
public Thing parse(File file) {
// Parse the file
}
}
を持って
を言って、あなたはそうのようなThingParserの拡張子を定義することができます
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番目の例をもっと丁寧に説明してください。 –
確かに、それについて何か教えていただければ、あなたは精巧にしたいと思います。特に意味をなさない部分はありますか? –
2番目のプログラムをもっと丁寧に説明してください。 –