[英]Why not .NET-style delegates rather than closures in Java?
好的,這將是我第三次擊敗一匹垂死的馬。
但是,這個問題與我之前的兩個關於閉包/代表的問題不同,后者詢問代表的計划以及閉包的預計規范和實現是什么。
這個問題是關於 - 當我們可以簡單地從我們心愛的友好鄰居 - 微軟竊取委托鎖,股票和桶的整個概念時,為什么Java社區在努力定義3種不同類型的閉包。
有兩個非技術性的結論我很想進入:
好的,除了以上兩種可能性,
Q1。 .NET風格的代理中是否存在三種(或更多種)封閉形式會解決的弱點或不足之處?
Q2。 我在Java和C#之間轉換時問這個問題,它讓我感到興奮的是C#代理完全符合我的需要。 是否有可在C#代理中當前不可用的閉包中實現的功能? 如果是這樣,他們是什么因為我看不到我需要什么比C#代表給我足夠的東西?
Q3。 我知道在java中實現閉包/委托的一個問題是減少語言的正交性,其中不止一種方式暴露於執行特定任務。 為了確保java保持其正交性水平,是否值得花費卷積和花費時間來避免代表? 在關系設計中,我們知道通過經常充分滿足第二范式而破壞正交性是可取的。 為簡單起見,為什么java不能減少正交性和OO-ness?
Q4。 JVM的體系結構在技術上受限於實現.NET樣式的委托。 如果這個原因(強調不可能的虛擬)是真的,那么為什么三個閉包提議不能隱藏在簡單的委托關鍵字或注釋之后:如果我們不喜歡使用@delegate,我們可以使用@method。 我看不出委托語句格式如何比三個閉包提案更復雜。
你的問題具有諷刺意味。 您想知道為什么Java社區正在努力解決添加閉包的三個不同提議,您建議的解決方案是添加第四個選項?
但要回答你的問題:
討論的正確論壇是openjdk項目lambda的郵件列表。 這不是建議可能影響該努力的地方。
C#和Java的類型系統有很大不同,因此C#解決方案不會直接應用。 例如,C#具有聲明站點方差(in / out),而java具有use-site variance(通配符)。 在C#中指定的lambda參數類型的推斷不適用於Java。
Java的發展必須保持向后兼容,但添加delegate關鍵字將是一個重大變化。
C#有三種類型的委托表達式:舊的委托表達式使用委托關鍵字,語句lambdas使用=> {,表達式為lambdas。 如果C#語言團隊讓它重新做,我們肯定沒有這么多形式。 Java為什么要采用C#的歷史包袱?
因為C#泛型操作基元,所以Func <>和Action <>委托類型可以用作窮人的結構函數類型。 但是在Java中,泛型被擦除,僅在引用類型上工作,並且類型不能通過它們的arity來區分。 因此,Java必須擁有大量明顯命名的“標准”函數類型才能獲得相同的效果。 那不太好看。
總的來說,C#解決方案不適應Java中非常自然的解決方案。
除代表外,C#還有閉包。 在我看來,他們並不相同。
delegate =函數指針。
closure = {function,environment}。 定義[匿名]功能並將其與環境打包在一起的方法。 嚴格來說,后者應該只稱為閉包,前者是'lambda表達'。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.