1. 程式人生 > 其它 >你該知道的JAVA泛型編譯期間的型別擦除

你該知道的JAVA泛型編譯期間的型別擦除

技術標籤: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檢查
這裡面細節很多,需要著重研究。
在這裡插入圖片描述