日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

Java 为什么不支持创建泛型化数组

發布時間:2024/9/30 java 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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 为什么不支持创建泛型化数组的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。