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