示例代碼
前幾天遇到這塊的編譯問題,查了一下乳乌,泛型這個東西捧韵,是可以擦除的...
代碼如下:
public class myClass {
private static List<String> list;
public static void main(String[] args) {
list = new ArrayList<>();
list.add("abc");
// list.add(123);
try {
Method declaredMethod = list.getClass().getDeclaredMethod("add", Object.class);
declaredMethod.invoke(list, 123);
System.out.print(list);
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
}
執(zhí)行結(jié)果是:
[abc, 123]
為什么能擦除
Java中的泛型基本上都是在編譯器這個層次來實現(xiàn)的再来。在生成的Java字節(jié)碼中是不包含泛型中的類型信息的。使用泛型的時候加上的類型參數(shù)芒篷,會在編譯器在編譯的時候去掉。這個過程就稱為類型擦除采缚。
Java的泛型是偽泛型,在設計之初扳抽,就是設計成了編譯期間殖侵,所有的泛型信息都會被擦除掉。具體詳細請參考Java不能實現(xiàn)真正泛型的原因拢军?這篇文章,簡單總結(jié)就是:
泛型是在JDK1.5出現(xiàn)時怔鳖,當時JDK1.4已經(jīng)在很多項目中使用,為了保證向前兼容结执,泛型不能像C語言那樣,實現(xiàn)真正的泛型献幔,所以做成了偽泛型。