[英]Understanding function literal types
假设此代码:
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
但是为什么不呢?
为什么Scala编译器没有将函数文字转换为某种概念:
new (String, String) => String
请记住,Scala会编译为JVM字节码。 在JVM中new (String, String) => String
没有诸如“ conceptual new (String, String) => String
”之类的东西。 只有对象和方法(至少在Java 8之前)。 在Java语言中,您必须在Guava和Apache Commons中使用无聊的Callable<T>
, Runnable
或各种Function
抽象。 没有其他办法了。 从这个角度来看,Scala通过在匿名FunctionX[...]
类上添加语法糖来基本上隐藏Java样板。
这也是当您使用需要函数的方法(所谓的eta扩展 )时,Scala编译器不得不做很多事情的原因之一。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.