茫茫人海千千万万,感谢这一秒你看到这里。希望我的文章对你的有所帮助!

愿你在未来的日子,保持热爱,奔赴山海!

前言:昨天我们终于讲完了泛型的全部使用!对泛型的使用有了充分的了解,知道泛型能作用于类、方法、接口上。但是对于一些泛型类型还是不确定情况的下呢,我们就可以使用接下来要学习的通配符。

所以,接下来我们将会对泛型通配符的学习--泛型通配符的基本使用!

👺泛型通配符

在我们之前的学习泛型的过程当中,在当我们使用泛型类或者接口时,传递的数据中,泛型类型不确定,可以通过通配符<?>表示。但是一旦使用泛型的通配符后,只能使用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。当然还有很多的应用,期待你慢慢发现!

那我们继续期待欢迎期待下一章的到来!

让我们也一起加油吧!本人不才,如有什么缺漏、错误的地方,也欢迎各位人才大佬评论中批评指正!当然如果这篇文章确定对你有点小小帮助的话,也请亲切可爱的人才大佬们给个点赞、收藏下吧,一键三连,非常感谢!

学到这里,今天的世界打烊了,晚安!虽然这篇文章完结了,但是我还在,永不完结。我会努力保持写文章。来日方长,何惧车遥马慢!

感谢各位看到这里!愿你韶华不负,青春无悔!