簡體   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