Java 泛型數組

來源:互聯網
上載者:User

標籤:

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

 

[java] view plaincopy 
  1. List<String>[] ls = new ArrayList<String>[10];  

是不支援的,而

 

 

[java] view plaincopy 
  1. List<String>[] ls = new ArrayList[10]  

卻可以。

 

 

 

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

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

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

 

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

基於以上的原因,Java不支援聲明泛型數組,更確切地表達是:數組的類型不可以是類型變數,除非是採用萬用字元的方式,看下面這個例子:

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


因為對於萬用字元的方式,最後取出資料是要做顯式的類型轉換的,所以並不會存在上一個例子的問題。

Java 泛型數組

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.