繁体   English   中英

了解函数文字类型

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM