繁体   English   中英

奇怪的SAM规则与功能

[英]Strange SAM rules with functions

单抽象方法转换考虑函数的确切规则是什么? 在下面的代码中有两个非常相似的情况,一个是编译的,第二个不是,当用Scala 2.12.4编译时:

trait SAM {
  def apply(a: Int, b: Int): Unit
}

def callSAM(sam: SAM): Unit = {
  sam(0, 1)
}

def iAmSam(f: (Int, Int) => Unit) = {

  def lf(a: Int, b: Int) = f(a, b)

  callSAM(f) // does not work - error:
  //                          type mismatch:
  //                          found (Int, Int) => Unit,
  //                          required SAM

  callSAM(lf) // works. What is the difference?

  callSAM(f(_, _)) // works (lambda)

  callSAM((a, b) => f(a, b)) // works (lambda)
}

callSAM(lf)工作原理和callSAM(f)不起作用的原因是什么? 我在Scala 2.12发行说明中提到了一个提及,其中说:

请注意,只有lambda表达式转换为SAM类型实例,而不是FunctionN类型的任意表达式

对我来说, lf看起来不像lambda表达式。 在2.12.0之后规则是否放宽了? 当接受lf ,为什么f不是?

f只是一个物体,完全落在下面

FunctionN类型的任意表达式

lf是方法的名称,当用作表达式时,它是lf _的简写,后者又扩展为(x, y) => lf(x, y) ,这是一个lambda表达式。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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