在Java教程(http://docs.oracle.com/javase/tutorial/extra/generics/fineprint.html)我看到以下內容:爲什麼Java中允許使用未知通用類型的數組?
// Not really allowed.
List<String>[] lsa = new List<String>[10];
Object o = lsa;
Object[] oa = (Object[]) o;
List<Integer> li = new ArrayList<Integer>();
li.add(new Integer(3));
// Unsound, but passes run time store check
oa[1] = li;
// Run-time error: ClassCastException.
String s = lsa[1].get(0);
If arrays of parameterized type were allowed, the previous example
would compile without any unchecked warnings, and yet fail at run-time
// OK, array of unbounded wildcard type.
List<?>[] lsa = new List<?>[10];
Object o = lsa;
Object[] oa = (Object[]) o;
List<Integer> li = new ArrayList<Integer>();
li.add(new Integer(3));
// Correct.
oa[1] = li;
// Run time error, but cast is explicit.
String s = (String) lsa[1].get(0);
然後,他們解釋說,如果我們切換到List<String>[] lsa = new List<String>[10];
List<?>[] lsa = new List<?>[10];
那麼也沒關係,但我們必須上溯造型。
我的一個教授問了下面這個:「爲什麼後者會編譯?」
然後他給出了答案:「當參數是?的意思是數組中的每個單元格都可以包含一個ArrayList。因爲沒有任何有關泛型類型的假設,所以以前的異常不能發生。」
對於我來說,通配符的工作仍然沒有意義,而前一個沒有。如果我們必須在通配符示例中強制實施上傳,爲什麼我們不能在第一個示例中執行該操作?
如果有人能爲我解決這個問題,我將不勝感激。
的[什麼是與創建通用陣列的問題?]可能重複(http://stackoverflow.com/questions/18581002/whats-the-issue-with-creating-a-generic-array) –