Java 为什么不支持创建泛型化数组
生活随笔
收集整理的這篇文章主要介紹了
Java 为什么不支持创建泛型化数组
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
沒事的時候在書中翻了下泛型相關的知識,注意到一個比較有意思的問題:Java 不能創建泛型化數組。比如像下面這樣就是不允許的:
// 創建一個泛型類 public class Generic<T> { }// 測試類 public class Test {public static void main(String[] args) {// 創建一個泛型化數組:errorGeneric<Integer>[] generics = new Generic<Integer>[10];} }為什么不能創建泛型化數組呢?下面就來簡單的分析一下這個問題。
我們知道 Java 中的泛型只有在編譯階段存在,在代碼運行的時候是沒有泛型的,這也被稱為泛型擦除。下面是一段可以證明泛型擦除的代碼:
public static void main(String[] args) throws Exception {List<String> list = new ArrayList<>();list.add("abc");Class<? extends List> listClass = list.getClass();Method addMethod = listClass.getMethod("add", Object.class);// 在 String 類型的集合中添加一個 int 類型的數據addMethod.invoke(list, 10);// 輸出:2System.out.println(list.size());}上面的測試代碼中,我們創建了一個 String 類型的集合,通過反射技術獲取到集合對象的 add 方法,然后調用 invoke 執行了 add 方法,向 String 類型的集合中添加了一個 int 類型的整數,代碼會正確運行且輸出 2。
證明了泛型擦除現在還回到我們一開始的問題上:為什么不能創建泛型化數組?原因就是數組會記住它的元素類型,如果試圖存儲其他類型的元素,就會拋出一個 ArrayStoreException。generics = new Generic<Integer>[10]; 聲明了會創建一個 Generic<Integer> 元素類型的數組,但是在代碼運行階段會將泛型擦除,在泛型數組中添加元素自然就是不允許的了,這與數組的特性相矛盾。
那么有沒有什么方法創建泛型化數組呢?答案是有的:先建一個通配類型的數組,然后轉型為泛型數組。就像下面這樣:
public class Generic<T> { }public class Test {public static void main(String[] args) throws Exception {Generic<Integer>[] generics = (Generic<Integer>[]) new Generic[10];System.out.println(generics[0] = new Generic<Integer>());} }總結
以上是生活随笔為你收集整理的Java 为什么不支持创建泛型化数组的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 为什么黑豹聚合物水泥防水涂料不走网店销售
- 下一篇: 徐子韩老婆(徐子韩)