天天看點

為什麼 Java 不支援泛型數組

​​​Java不支援建立範型數組分析​​

Java 不支援泛型數組。也就是說,

List<String>[] ls = new ArrayList<String>[10];      

是不支援的,而

List<String>[] ls = new ArrayList[10]      

卻可以。

是我一直不清楚為什麼不能夠聲明泛型的數組,指定類型可以讓編譯的時候不會出現類型安全的提示。

直到今天我看到Sun的一篇文檔才清楚,裡面提到了一種情況:

List<String>[] lsa = new List<String>[10]; // Not really allowed.
Object o = lsa;
Object[] oa = (Object[]) o;
List<Integer> li = new ArrayList<Integer>();
li.add(new Integer(3));
oa[1] = li; // Unsound, but passes run time store check
String s = lsa[1].get(0); // Run-time error: ClassCastException.      

這種情況下,由于JVM泛型的擦除機制,在運作時JVM是不知道泛型資訊的,是以可以給oa[1]賦上一個ArrayList而不會出現ArrayStoreException,但是在取出資料的時候卻要做一次類型轉換,是以就會出現ClassCastException,如果可以進行泛型數組的聲明,上面說的這種情況在編譯期将不會出現任何的警告和錯誤,隻有在運作時才會出錯。而對泛型數組的聲明進行限制,對于這樣的情況,可以在編譯期提示代碼有類型安全問題,比沒有任何提示要強很多。

List<?>[] lsa = new List<?>[10]; // OK, array of unbounded wildcard type.
Object o = lsa;
Object[] oa = (Object[]) o;
List<Integer> li = new ArrayList<Integer>();
li.add(new Integer(3));
oa[1] = li; // Correct.
String s = (String) lsa[1].get(0); // Run time error, but cast is explicit.