我個人完全同意你的看法。問題的核心是Java的泛型不是協變的,這又是因爲Java的集合是可變的。
不可能對Java的類型系統編纂一類,似乎有存取器是實際上不變。試想一下,如果我們開始設計一些解決方案:
interface Immutable //marker for immutability
interface ImmutableMap<K, V> extends Map<K, V>, Immutable
但隨後ImmutableMap
是Map
一個子類,因此Map
是分配從ImmutableMap
所以返回這樣一個不變地圖的任何方法:
public ImmutableMap<K, V> foo();
可以被分配到Map並且因此可以在編譯時被突變:
Map<K, V> m = foo();
m.put(k, v); //oh dear
因此,你可以看到,這種類型的添加實際上並沒有阻止我們做任何壞事。我認爲由於這個原因,有人認爲它沒有足夠的提供。
像斯卡拉一種語言報關現場方差註解。也就是說,你可以指定一個類型爲協變(因而不可變),因爲Scala的Map(實際上它在V
參數中是協變的)。因此你的API可以聲明它的返回類型是可變的還是不可變的。
至於另一一邊,斯卡拉可以聲明路口的類型,這樣你甚至不需要創建ImmutableXYZ
接口作爲一個獨立的實體,您可以指定一個方法返回:
def foo : XYZ with Immutable
但隨後階有一個適當的類型系統,而Java不
爲什麼你需要做的是什麼? – 2010-11-28 11:58:51
快!有人聯繫Joshua Bloch!我不知道他的電子郵件... – 2010-11-28 13:05:34
約書亞布洛赫[有一個Twitter帳戶](http://twitter.com/joshbloch),任何人都知道如何操作Twitter ... – 2010-11-28 13:15:25