先上兩段程式碼:
public static <T> void show1(List<T> list){ for (Object object : list) { System.out.println(object.toString()); } } public static void show2(List<?> list) { for (Object object : list) { System.out.println(object); } }
可以看到show1方法中我們使用了T,大家都知道這是泛型的常見寫法,那麼這裡的T指的是某一類具體的對象,list集合裡只能存放相同類型數據,如果插入不同類型數據則會報錯。
那麼show2方法中我們使用的是? ,可以看到在void前面並沒有<t></t>
,?可以表示成佔位符,它自己也不知道list集合中會存放多少種類型的數據,所以這樣就表明我們的list中存放N種數據類型也是可以的。
我們透過一段測試程式碼來直觀的感受一下二者的區別吧:
public static void test(){ List<Student> list1 = new ArrayList<>(); list1.add(new Student("zhangsan",18,0)); list1.add(new Student("lisi",28,0)); list1.add(new Student("wangwu",24,1)); //这里如果add(new Teacher(...));就会报错,因为我们已经给List指定了数据类型为Student show1(list1); System.out.println("************分割线**************"); //这里我们并没有给List指定具体的数据类型,可以存放多种类型数据 List list2 = new ArrayList<>(); list2.add(new Student("zhaoliu",22,1)); list2.add(new Teacher("sunba",30,0)); show2(list2); }
來看看運行結果:
Student{name='zhangsan ', age=18, sex=0}
Student{name='lisi', age=28, sex=0}
Student{name='wangwu', age=24, sex=1}
************分割線**************
Student{name='zhaoliu', age=22, sex=1}
Teacher{name='sunba', age=30, sex=0}
#從show2方法可以看出和show1的區別了,list2存放了Student和Teacher兩種類型,同樣可以輸出數據,所以這就是T和?的區別啦~小夥伴們了解了吧
下面來看看?的延伸寫法:
List extends 資料型別> list
public static void show3(List<? extends Teacher> list) { for (Object object : list) { System.out.println(object); } }
List extends Teacher> list
這種寫法表示可以可以寫法表示可以#List extends Teacher> list這個寫法表示可以接收Teacher和它的子類別資料型別的list集合,寫個測試方法
show3(list2);
Student{name='zhaoliu', age=22, sex=1} Teacher{name='sunba', age=30, sex=0}
可以看到正常輸出,因為集合中的資料都是Teacher的子類別,如果我們將
List extends Teacher> list改成
List extends Student> list會出現什麼情況?
仔細看這張圖,我們新建了一個list3並且宣告資料型別為Teacher,這個時候呼叫
show3(List extends Student> list)
List super 資料型別> list
public static void show4(List<? super Student> list) { for (Object object : list) { System.out.println(object); } }可以看出來,我們接收的是Student及它父類別的集合,我們寫兩個集合資料然後呼叫試試看。
List list4 = new ArrayList<>(); list4.add(new Student("sunba",30,0)); list4.add(new Teacher("zhaoliu",22,1)); show4(list4);在list中插入了一個Student和Teacher對象,看看結果:
Student{name='sunba', age=30, sex=0} Teacher{name='zhaoliu', age=22, sex=1}沒毛病,正常運作並輸出。 下面我們來看看,如果我們是傳遞的Student的子類別的集合會咋樣 可以看到和之前的一樣,會報錯,理由也是一樣的,以為我們已經定義了只能接收Student及其父類別的資料型別。 最後來看一種情況
如果我定義List的時候沒有指定資料類型,並且插入了一個Child,Student,Teacher,還是呼叫
show4(List super Student> list)
以上是java泛型中佔位符T和?有哪些差別的詳細內容。更多資訊請關注PHP中文網其他相關文章!