假设这段代码:
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. 但为什么不呢?