如果我理解正確,在JVM下,每次使用lambda表達式時都必須創建一個Object。爲什麼Scala中的FunctionN類型被創建爲AnyRef的子類型,而不是AnyVal?
爲什麼開銷?爲什麼Scala創作者在設計FunctionN類型時選擇擴展AnyRef而不是AnyVal?我的意思是,它們本身沒有任何真正的'價值',所以函數不應該是具有基本單元表示的值對象(或者包含用於相等性檢查或等等的一些散列)的值?我可以想象不會爲每個lambda分配一個對象都會導致某些代碼庫中的性能提升。
我認爲擴展AnyVal的一個明顯的缺點是它會禁止子類化函數類型。也許這一點就足以成爲AnyVal的延伸,但還有什麼其他原因?
- 編輯
我明白功能需要關閉超過其他變量,但我認爲這將是更自然的將其建模作爲參數傳遞給應用方法,而不是功能N對象的字段成員(從而去除在這部分必須有一個java.lang.Object) - 畢竟,在編譯時不是所有已知的變量都關閉了嗎?
- 再次編輯
我發現了它;我想到的是'拉姆達升降'。
功能確實具有「真正的價值」:他們關閉了。 –