茫茫人海千千万万,感谢这一秒你看到这里。希望我的文章对你的有所帮助!
愿你在未来的日子,保持热爱,奔赴山海!
前言:昨天我们终于讲完了泛型的全部使用!对泛型的使用有了充分的了解,知道泛型能作用于类、方法、接口上。但是对于一些泛型类型还是不确定情况的下呢,我们就可以使用接下来要学习的通配符。
所以,接下来我们将会对泛型通配符的学习--泛型通配符的基本使用!
👺泛型通配符
在我们之前的学习泛型的过程当中,在当我们使用泛型类或者接口时,传递的数据中,泛型类型不确定,可以通过通配符<?>表示。但是一旦使用泛型的通配符后,只能使用Object类中的共性方法,集合中元素自身方法无法使用。
😞 通配符基本使用
泛型的通配符:不知道使用什么类型来接收的时候,此时可以使用?,?表示未知通配符。
此时只能接受数据,不能往该集合中存储数据。
举个例子大家理解使用即可:
// ?代表可以接收任意类型
// 泛型不存在继承、多态关系,泛型左右两边要一样
//ArrayList<Object> list = new ArrayList<String>();这种是错误的
//泛型通配符?:左边写<?> 右边的泛型可以是任意类型
ArrayList<?> list1 = new ArrayList<Object>();
ArrayList<?> list2 = new ArrayList<String>();
ArrayList<?> list3 = new ArrayList<Integer>();
注意:泛型不存在继承、多态关系,泛型左右两边要一样,jdk1.7后右边的泛型可以省略
而泛型通配符?,右边的泛型可以是任意类型。
泛型通配符?主要应用在参数传递方面,让我们一起瞧瞧呗:
public static void main(String[] args) {
ArrayList<Integer> list1 = new ArrayList<Integer>();
test(list1);
ArrayList<String> list2 = new ArrayList<String>();
test(list2);
}
public static void test(ArrayList<?> coll){
}
嘿嘿,是不是见识到了通配符的厉害,可以传递不同类似进去方法中了!
😟5.2 通配符高级使用
之前设置泛型的时候,实际上是可以任意设置的,只要是类就可以设置。但是在JAVA的泛型中可以指定一个泛型的上限和下限。
泛型的上限:
- 格式:
类型名称 <? extends 类 > 对象名称
- 意义:
只能接收该类型及其子类
泛型的下限:
-
格式:
类型名称 <? super 类 > 对象名称
-
意义:
只能接收该类型及其父类型
比如:现已知Object类,Animal类,Dog类,Cat类,其中Animal是Dog,Cat的父类
class Animal{}//父类
class Dog extends Animal{}//子类
class Cat extends Animal{}//子类
-
首先我们先看下,泛型的上限<font color=#ff1493>
<? extends 类 >
</font>:// 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>();
可以看出,泛型的上限只能是该类型的类型及其子类。
-
我们再来看看泛型的下限<font color=#ff1493>
<? super 类 >
</font>: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>();//报错
可以看出,泛型的下限只能是该类型的类型及其父类。
-
一般泛型的上限和下限也是用来参数的传递:
再比如:现已知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。当然还有很多的应用,期待你慢慢发现!
那我们继续期待欢迎期待下一章的到来!
让我们也一起加油吧!本人不才,如有什么缺漏、错误的地方,也欢迎各位人才大佬评论中批评指正!当然如果这篇文章确定对你有点小小帮助的话,也请亲切可爱的人才大佬们给个点赞、收藏下吧,一键三连,非常感谢!
学到这里,今天的世界打烊了,晚安!虽然这篇文章完结了,但是我还在,永不完结。我会努力保持写文章。来日方长,何惧车遥马慢!
感谢各位看到这里!愿你韶华不负,青春无悔!