您好,登錄后才能下訂單哦!
深入淺析java中集合泛型的本質?相信很多沒有經驗的人對此束手無策,為此本文總結了問題出現的原因和解決方法,通過這篇文章希望你能解決這個問題。
1、初始化兩個集合,一個使用泛型,一個不使用
ArrayList list1 = new ArrayList(); ArrayList<String> list2 = new ArrayList<String>();
2、有定義類型可得在list2中添加int類型會報錯
list2.add("Hello"); list2.add(20); //報錯
3、獲取兩個對象的類類型進行比較
Class c1 = list1.getClass(); Class c2 = list2.getClass(); System.out.println(c1 == c2);
通過c1==c2結果返回true,說明編譯之后集合的泛型是去泛型化的,java中集合的泛型是為了防止錯誤輸入的,只在編譯階段有效,繞過編譯就無效了
4、驗證:通過方法的反射來繞過編譯
try { Method m = c2.getMethod("add", Object.class); m.invoke(list2,20); System.out.println(list2); } catch (Exception e) { e.printStackTrace(); }
5、輸出結果
6、完整代碼
package com.format.test; import java.lang.reflect.Method; import java.util.ArrayList; /** * Created by Format on 2017/6/4. */ public class Test2 { public static void main(String[] args) { ArrayList list1 = new ArrayList(); ArrayList<String> list2 = new ArrayList<String>(); list2.add("Hello"); // list2.add(20); //報錯 Class c1 = list1.getClass(); Class c2 = list2.getClass(); System.out.println(c1 == c2); /** * 反射操作都是編譯之后的操作 * c1==c2結果返回true,說明編譯之后集合的泛型是去泛型化的 * java中集合的泛型是為了防止錯誤輸入的,只在編譯階段有效,繞過編譯就無效了 * 驗證:通過方法的反射來繞過編譯 */ try { Method m = c2.getMethod("add", Object.class); m.invoke(list2,20); System.out.println(list2); } catch (Exception e) { e.printStackTrace(); } } }
看完上述內容,你們掌握深入淺析java中集合泛型的本質的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。