你該知道的JAVA泛型編譯期間的型別擦除
阿新 • • 發佈:2020-12-22
技術標籤:java
1.Java的泛型是偽泛型,這是因為Java在編譯期間,所有的泛型資訊都會被擦掉,正確理解泛型概念的首要前提是理解型別擦除。
比如這個例子
public class Test {
public static void main(String[] args) {
ArrayList<String> list1 = new ArrayList<String>();
list1.add("abc");
ArrayList<Integer> list2 = new ArrayList<Integer>();
list2.add(123);
System.out.println(list1.getClass() == list2.getClass());
}
}
會返回true。
再看一個例子。
public class Test {
public static void main(String[] args) throws Exception {
ArrayList<Integer> list = new ArrayList<Integer> ();
list.add(1); //這樣呼叫 add 方法只能儲存整形,因為泛型型別的例項為 Integer
list.getClass().getMethod("add", Object.class).invoke(list, "asd");
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
}
}
}
居然還可以通過反射來新增其他型別的元素。
那如何避免型別擦除造成的泛型無效呢?
1.原始型別
2.良好的程式碼規範利用IDE檢查
這裡面細節很多,需要著重研究。