JAVA中泛型的本質

以下的內容需要一點點JAVA反射的知識,建議各位小夥伴可以先看一下我的淺析JAVA反射機制(如果實在不想看的話看懂下面的內容應該也不會有大問題,可能會有一點理解困難)。
我們先來看一個程序:

AyyayList<String> a = new ArrayList<String>();
a.add("hh");
a.add(20);

顯而易見,a.add(20)是一個錯誤的操作,由此引出泛型的基本作用就是防止錯誤的輸入。
再看這個程序:

AyyayList<String> a = new ArrayList<String>();
ArrayList b = new ArrayList();
a.add("hh");
Class c1 = a.getClass();
Class c2 = b.getClass();

各位小夥伴們猜一猜c1 == c2的結果是什麼?
答案是true,爲什麼呢?因爲所有反射的操作都是在運行時的,c1 == c2既然爲true,那麼就很好的證明了編譯之後,程序會採取去泛型化的措施,也就是說JAVA中的泛型,只在編譯階段有效。
我們通過反射來進行驗證(爲了使邏輯清晰,去掉了異常處理):

AyyayList<String> a = new ArrayList<String>();
ArrayList b = new ArrayList();
a.add("hh");
Class c1 = a.getClass();
Class c2 = b.getClass();
Method me = a.getMethod("add",Object.class);
me.invoke(a,100);
System.out.println(a);

me.invoke(a,100);是正確的,因爲繞過了編譯階段也就繞過了泛型,最後輸出[hh,100]

發佈了33 篇原創文章 · 獲贊 93 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章