假设这段代码:
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?")
}
此代码的第二行由编译器替换为:
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
。
为什么不同的符号?为什么 Scala 编译器没有将函数字面量转换为某种概念性的:new ((String, String) => String)
没有无聊的Function2[String, String, String]
类型?或相反亦然。
一种解释是类名不能是多部分的:(T1, T2) => R
. 但为什么不呢?