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,如果可以進行泛型陣列的宣告,上面說的這種情況在編譯期將不會出現任何的警告和錯誤,只有在執行時才會出錯。而對泛型陣列的宣告進行限制,對於這樣的情況,可以在編譯期提示程式碼有型別安全問題,比沒有任何提示要強很多。
基於以上的原因,Java不支援宣告泛型陣列,更確切地表達是:陣列的型別不可以是型別變數,除非是採用萬用字元的方式,看下面這個例子:
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.
因為對於萬用字元的方式,最後取出資料是要做顯式的型別轉換的,所以並不會存在上一個例子的問題。
轉載自:Java 泛型陣列
參考:java 泛型陣列 深度解析
相關文章
- java泛型之泛型陣列。Java泛型陣列
- 泛型陣列列表ArrayList泛型陣列
- ajax 提交陣列 泛型集合陣列泛型
- 【ITOO】--陣列、集合、泛型解析陣列泛型
- 泛型、陣列列表與協變泛型陣列
- Java 集合列舉泛型(一)Java泛型
- 【java】【泛型】泛型geneticJava泛型
- java泛型之泛型方法。Java泛型
- Java泛型知識點:泛型類、泛型介面和泛型方法Java泛型
- Java 泛型Java泛型
- Java泛型Java泛型
- 好程式設計師Java學習路線分享java為什麼不支援泛型陣列程式設計師Java泛型陣列
- java基礎(十) 陣列型別Java陣列型別
- Java 泛型原理Java泛型
- Java+泛型Java泛型
- java泛型一二Java泛型
- Java(7)泛型Java泛型
- Java-泛型Java泛型
- java泛型剖析Java泛型
- JAVA泛型類Java泛型
- C#中陣列Array、ArrayList、泛型List<T>的比較C#陣列泛型
- java之資料型別與陣列Java資料型別陣列
- Java™ 教程(泛型原始型別)Java泛型型別
- Java泛型與型別擦除Java泛型型別
- C++ 簡單實現陣列類泛型程式設計示例C++陣列泛型程式設計
- 淺談java泛型Java泛型
- java 基礎 泛型Java泛型
- Java:Collection集合、泛型Java泛型
- Java泛型知識Java泛型
- Java泛型複習Java泛型
- 認識Java泛型Java泛型
- Java 泛型詳解Java泛型
- Java泛型筆記Java泛型筆記
- Java基礎-泛型Java泛型
- JAVA泛型入門Java泛型
- Effective Java(四) 泛型Java泛型
- Java泛型詳解Java泛型
- Java集合和泛型Java泛型