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());// 编译异常
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章