泛型<T>和 <?> 的區別

    技術交流羣裏有小白問這個問題,並轉發了一些blog給我看。 感覺寫的不夠通透,而且有錯誤的地方,特地寫一下。

 

1. Class<T> 表示一個定義了一個泛型

         這個類型不確定, 但是不能同時變成兩個類型

    舉個栗子

    我們將兩個不同類型的鏈表合併

    public static <T> void merge1(List<T> list1, List<T> list2){
        List list = new LinkedList();
        list.addAll(list1);
        list.addAll(list2);
        for (int i = 0; i < list.size(); ++i){
            System.out.println(list.get(i));
        }
    }

    public static void test(){
        List<Student> list1 = new ArrayList<>();
        list1.add(new Student("Tom",11));

        List<Teacher> list2 = new ArrayList<>();
        list2.add(new Teacher("Jerry",33));

        merge1(list1, list2);  //會報錯
    }

     我們將泛型定義爲T, 但在傳參數的時候卻期望它既能傳 List<Student> 又能傳 List<Teacher>, 於是這就有點強人所難了,編譯器犯難了,就報錯

     解決這樣的問題, 就要爲泛型 <T> 定義更爲通用的類型了, 這樣 <?> 就派上用場了。

 

2.  <?> 是爲了實現更爲通用的類型

    <?> 可以是任何類型, 不再要求只能是同一種類型了。

    public static void merge2(List<?> list1, List<?> list2){
        List list = new LinkedList();
        list.addAll(list1);
        list.addAll(list2);
        for (int i = 0; i < list.size(); ++i){
            System.out.println(list.get(i));
        }
    }

    public static void test(){
        List<Student> list1 = new ArrayList<>();
        list1.add(new Student("Tom",11));

        List<Teacher> list2 = new ArrayList<>();
        list2.add(new Teacher("Jerry",33));

//        merge1(list1, list2);  //會報錯

        merge2(list1, list2);
    }

 

 

 

推薦相關博文: https://www.cnblogs.com/coprince/p/8603492.html

 

 

 

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