前段時間,甲骨文決定爲Java 8添加閉包將是一個好主意。我想知道如何解決設計問題與Scala相比,Scala從第一天起就已經關閉。Scala中的閉包vs Java中的閉包
援引開放的問題從javac.info:
能方法處理可用於功能類型? 如何做這項工作並不明顯。一個問題是,方法處理reify類型參數,但以一種干擾函數子類型的方式。
我們可以擺脫「拋出」類型參數的顯式聲明嗎? 只要聲明的邊界是一個檢查的異常類型,這個想法就是使用disjuntive類型推斷。這不是嚴格向後兼容的,但不太可能破壞真正的現有代碼。然而,由於語法模糊性,我們可能無法擺脫類型參數中的「拋出」。
禁止在舊式的循環索引變量
手柄接口,如比較定義一種以上的方法,所有,但其中一個@Shared將由Object繼承的方法來實現。 「使用單一方法的接口」的定義應該只計算在Object中不會實現的方法,並且應該將多個方法統計爲一個,如果實現其中一個方法將全部實現它們。主要的是,這需要更精確地說明接口只有一個抽象方法意味着什麼。
從指定函數類型映射接口:名稱,參數等 我們完全應該精確地指定由函數類型系統生成的接口的映射。
類型推斷。類型推斷的規則需要增加以適應異常類型參數的推斷。同樣,封閉轉換所使用的子類型關係也應該反映出來。
輔助異常類型參數,以幫助改進異常透明度。 也許make elided異常類型參數意味着界限。這樣可以通過添加一個新的通用異常參數來修改沒有異常類型參數的現有通用接口,如java.util.concurrent.Callable。
函數類型的類文字是如何形成的? 是否#void()。class?如果是這樣,如果對象類型被擦除,它是如何工作的?是嗎?(?)。class?
系統類加載器應動態生成函數類型接口。 函數類型對應的接口應該由引導類加載器按需生成,因此它們可以在所有用戶代碼之間共享。對於原型,我們可能會使用javac生成這些接口,以便原型生成的代碼可以在庫存(JDK5-6)VM上運行。
對lambda表達式的評估每次都必須產生一個新對象嗎? 希望沒有。例如,如果一個lambda從一個封閉範圍捕獲任何變量,它可以靜態分配。同樣,在其他情況下,如果lambda沒有捕獲循環內聲明的任何變量,則可以將其移出內部循環。因此,如果規範對於lambda表達式的結果的引用標識沒有任何承諾,那麼這樣的優化可以由編譯器完成。
據我瞭解2,6和7不是Scala中的一個問題,因爲Scala不使用檢查異常作爲某種「影子式系統」之類的Java。
其餘的呢?