在回答記者提問關於這裏:https://stackoverflow.com/a/9872630/82609爲什麼我們可以使用陣列的通用參考
我試着做到以下幾點:
Comparator<String>[] comparators = new Comparator[] {...};
它的工作原理!但是,下列情況不:
Comparator<String>[] comparators = new Comparator<String>[] {...};
論相關的問題,我的假設:
我想這是因爲最初的陣列的合同可能是一些 這樣的:
如果您創建了一個X類型的數組,那麼您將永遠無法將 中的任何東西放入IS-NOT-AN X中。如果您RY,你會得到一個ArrayStoreException信息
因此允許使用泛型創建陣列會導致像不同 規則:如果您創建
X<Y>
類型的數組,你永遠不會能夠到 把任何不是一個X.如果你嘗試,你會得到一個 ArrayStoreException。但是,由於類型擦除,您可以添加
X<Y>
和X<Z>
對象!
但想着它,將它確實是一個問題有:
Comparator<String>[] comparators = new Comparator<String>[] {...};
我真的不明白爲什麼它是不可能的,因爲使用這樣的事情:
- 檢查運行時插入的類
- 檢查在編譯時
插入最後,我們可以使用與一般類型的參考和,因爲不可能創建一個泛型類型的數組的數組類型,我想很多人甚至不知道這是可能的。
我只是想知道是否有人知道背後的原因?
這是一個有點像強迫人們使用List<String> = new ArrayList();
,而不是使用List<String> = new ArrayList<String>();
dimitrisli你給約書亞布洛赫的名著一個很好爲例。 正如你所解釋的那樣,使用通用數組+協方差都是危險的,並且可能導致ClassCastException,而我們期望使用協方差數組的ArrayStoreException。
但請注意以下幾點仍然是合法的,並導致相同:
List<String>[] stringLists = new List[1];
List<Integer> intList = Arrays.asList(42);
Object[] objects = stringLists;
objects[0] = intList;
String s = stringLists[0].get(0);
但是它產生在編譯時未檢查鑄警告,因爲你mentionned,在運行一個ClassCastException。
可能重複的[錯誤通用數組創建](http://stackoverflow.com/questions/3903196/error-generic-array-creation) – 2012-03-27 09:16:25
@DaveWebb什麼是重複的? – 2012-03-27 09:19:21
有人已經問過同樣的問題。 http://stackoverflow.com/questions/3903196/error-generic-array-creation – 2012-03-27 09:24:45