这是我参与11月更文挑战的第7天,活动详情查看:2021最后一次更文挑战」。
茫茫人海千千万万,感谢这一秒你看到这里。希望我的文章对你的有所帮助!
愿你在未来的日子,保持热爱,奔赴山海!
前言:昨天我们终于讲完了泛型通配符的基本使用,
所以,接下来我们将会对泛型通配符的学习--泛型通配符的高级使用!
👺泛型通配符
在我们之前的学习泛型的过程当中,在当我们使用泛型类或者接口时,传递的数据中,泛型类型不确定,可以通过通配符<?>表示。但是一旦使用泛型的通配符后,只能使用Object类中的共性方法,集合中元素自身方法无法使用。
😟5.2 通配符高级使用
之前设置泛型的时候,实际上是可以任意设置的,只要是类就可以设置。但是在JAVA的泛型中可以指定一个泛型的上限和下限。
泛型的上限:
格式: 类型名称 <? extends 类 > 对象名称
意义: 只能接收该类型及其子类
泛型的下限:
格式: 类型名称 <? super 类 > 对象名称
意义: 只能接收该类型及其父类型
比如:现已知Object类,Animal类,Dog类,Cat类,其中Animal是Dog,Cat的父类
class Animal{}//父类
class Dog extends Animal{}//子类
class Cat extends Animal{}//子类
复制代码
首先我们先看下,泛型的上限<? extends 类 >:
// ArrayList<? extends Animal> list = new ArrayList<Object>();//报错
ArrayList<? extends Animal> list2 = new ArrayList<Animal>();
ArrayList<? extends Animal> list3 = new ArrayList<Dog>();
ArrayList<? extends Animal> list4 = new ArrayList<Cat>();
复制代码
可以看出,泛型的上限只能是该类型的类型及其子类。
我们再来看看泛型的下限<? super 类 >:
ArrayList<? super Animal> list5 = new ArrayList<Object>();
ArrayList<? super Animal> list6 = new ArrayList<Animal>();
// ArrayList<? super Animal> list7 = new ArrayList<Dog>();//报错
// ArrayList<? super Animal> list8 = new ArrayList<Cat>();//报错
复制代码
可以看出,泛型的下限只能是该类型的类型及其父类。
一般泛型的上限和下限也是用来参数的传递:
http://www.360doc.com/content/21/1104/07/46403850_1002672849.shtml
http://www.360doc.com/content/21/1107/21/46403850_1003191175.shtml
http://www.360doc.com/content/21/1107/21/46403850_1003190908.shtml
再比如:现已知Object类,String 类,Number类,Integer类,其中Number是Integer的父类
public static void main(String[] args) {
Collection<Integer> list1 = new ArrayList<Integer>();
Collection<String> list2 = new ArrayList<String>();
Collection<Number> list3 = new ArrayList<Number>();
Collection<Object> list4 = new ArrayList<Object>();
getElement(list1);
getElement(list2);//报错
getElement(list3);
getElement(list4);//报错
getElement2(list1);//报错
getElement2(list2);//报错
getElement2(list3);
getElement2(list4);
}
// 泛型的上限:此时的泛型?,必须是Number类型或者Number类型的子类
public static void getElement1(Collection<? extends Number> coll){}
// 泛型的下限:此时的泛型?,必须是Number类型或者Number类型的父类
public static void getElement2(Collection<? super Number> coll){}
复制代码
学到这里,我们泛型也就学完了!
🌸总结
相信各位看官都对泛型有了全部的深入的了解和体验,在平时开发,比较常见使用在泛型的使用有集合框架中的List和Map。当然还有很多的应用,期待你慢慢发现!
那我们继续期待欢迎期待下一章的到来!
让我们也一起加油吧!本人不才,如有什么缺漏、错误的地方,也欢迎各位人才大佬评论中批评指正!当然如果这篇文章确定对你有点小小帮助的话,也请亲切可爱的人才大佬们给个点赞、收藏下吧,一键三连,非常感谢!
https://gitee.com/numerical-control-system
https://www.thinksaas.cn/user/space/50002/
https://zhuanlan.zhihu.com/p/430534517
https://zhuanlan.zhihu.com/p/430536898
https://zhuanlan.zhihu.com/p/430537972
————————————————