このコードを仮定します:
def main(args: Array[String]) {
val func = (x: String, y :String) => x + ", " + y
println(myFunc(func))
}
def myFunc(f: (String, String) => String) = {
f("Hey","how are you?")
}
このコードの 2 行目は、コンパイラによって次のように置き換えられます。
val func = new Function2[String, String, String] {
def apply(x: String, y: String): String = x + ", " + y
}
署名が示すように、この場合の型は型func
にも対応していると推測できます。と同じ型であることを意味します。(String, String) => String)
myFunc
Function2[String, String, String]
(String, String) => String
なぜ違う表記?new ((String, String) => String)
なぜ Scala コンパイラは関数リテラルをある種の概念的なものに変換しなかったのFunction2[String, String, String]
ですか? またはその逆。
1 つの説明は、クラス名を次のようにマルチパートにすることはできないということです(T1, T2) => R
。しかし、結局のところ、なぜでしょうか?