Java 泛型通配符(泛型上限下限)

Demo

泛型通配符<?>
  1. 泛型繼承
    • list1與list2之間根本沒有關係,它們是相互獨立的.
ArrayList<Object> list1 = null;
ArrayList<String> list2 = null;
list2 = list1; 編譯不通過
list1 = list2; 編譯不通過
  1. <?>是所有泛型的父類
    • ArrayList類型與ArrayList沒有半毛錢關係
    • ArrayList<?>類型可以用來接收ArrayList或者ArrayList
ArrayList<?> list = null;
ArrayList<Object> list1 = null;
ArrayList<String> list2 = null;
list = list1;
list = list2;
受限泛型通配符(泛型上限和下限)
  1. 上限通配符,像(-∞~Person]
ArrayList<? extends Person> list1 = null;
  1. 下限的通配符,像[Person~+∞)
ArrayList<? super Person> list2 = null;
受限泛型讀與取和賦值
  1. 上下文代碼
// 父類
class Person {
}
// 子類
class Student extends Person {
}
// 上限通配符
ArrayList<? extends Person> list1 = null;
// 下限通配符
ArrayList<? super Person> list2 = null;
// Person < Object
ArrayList<Object> list3 = null;
// Person = Person
ArrayList<Person> list4 = null;
// Student<Person
ArrayList<Student> list5 = null;
  1. 受線泛型賦值
// list1的泛型上限是Person,沒有下限,
// list3的泛型是Object,超過Person類型肯定不能被list1接收的
list1 = list3;// 編譯異常
// list3的泛型是Person,等於Person類型,肯定能被list1接收.
list1 = list4;// 編譯通過
// list5的泛型是Student,小於Person類型,肯定能被list1接收.
list1 = list5;// 編譯通過
// list2的泛型下限是Person,沒有上限.
// list3的泛型是Object,超過Person類型肯定能被list2接收
list2 = list3;// 編譯通過
// list4的泛型是Person,等於Person類型肯定能被list2接收
list2 = list4;// 編譯通過
// list5的泛型是Student,小於Person類型,肯定不能被list2接收.
list2 = list5;// 編譯異常
  1. 受限泛型讀取
// list1的泛型上限是Person,沒有下限,(-∞~Person]
// list2的泛型下限是Person,沒有上限,[Person~+∞)
// 讀操作
Person person = list1.get(0);// list1中所有的元素都是Person的子類
Object object = list1.get(0);// list1中所有的元素都是Object的子類
Object object1 = list2.get(0);// list2中所有的元素都是Object的子類
  1. 受限泛型寫入
// 寫操作
// list1是沒有下限的,根本不知道list1的泛型是Person或者Student抑或是Person其他子類,
// 比如向list1中添加Person類元素,而list1實際泛型是Student,父類是不能強制轉爲子類的,肯定提示編譯異常.
// 再或者向list1中添加Student元素,而list1實際泛型是Student類子類,也是會編譯異常.
// 所以永遠都不知道list1的真實泛型類型,這也就不可能向list1中寫入元素了.
list1.add(new Person());// 編譯異常
list1.add(new Student());// 編譯異常
// list2是有下限的,
// 比如向list2中添加它的泛型下限類型的子類也就是Person類或者Person類的子類,是可以的.因爲子類可以用父類接收(多態)
// 但是向list2中添加大於它泛型下限的類是不行了,
// 與list1中說的原因類似,假如向list2中添加一個(class Person1 extends Person{})類,但是list2中真實的泛型類型是(class Person2 extends Person{})類,這樣肯定是提示編譯異常.
list2.add(new Person());// 編譯通過
list2.add(new Student());// 編譯通過
list2.add(new Object());// 編譯異常
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章