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

2 篇文章 0 订阅

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;// 编译异常
// list4的泛型是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());// 编译异常
  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值