技術交流羣裏有小白問這個問題,並轉發了一些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