假设这段代码:
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
。
但毕竟为什么不呢?
答案 0 :(得分:6)
为什么Scala编译器还没有将函数文字转换为某种概念:
new (String, String) => String
请记住,Scala编译为JVM字节码。 JVM中没有“概念new (String, String) => String
”这样的东西。只有对象和方法(至少在Java 8之前)。在Java语言中,您必须在Guava和Apache Commons中使用枯燥的Callable<T>
,Runnable
或各种Function
抽象。没有其他办法了。从这个角度来看,Scala基本上通过在匿名FunctionX[...]
类上添加语法糖来隐藏Java样板。
这也是当您使用期望函数的方法(所谓的 eta扩展)时,Scala编译器必须做很多事情的原因之一。