Java泛型进阶之通配符

一.通配符用于解决什么问题

首先给出一个泛型类:

Java泛型进阶之通配符_第1张图片

然后写一个静态方法,并在main方法之中进行调用:

Java泛型进阶之通配符_第2张图片

可以正常使用func方法并打印出hello

但要是又实例化了其他类型的message,就出现问题了:

Java泛型进阶之通配符_第3张图片

所以我们写的这个func方法只能被某些Message成员调用,那该如何解决?

这就要用到通配符 ,即问号。

二.通配符的使用

我们用通配符来修改上述func方法,就不会报错啦:

Java泛型进阶之通配符_第4张图片

这里使用通配符“?”描述的是它可以接收任何类型

注意:

由于不确定是什么类型,就无法进行修改:

Java泛型进阶之通配符_第5张图片

这是错误的。

三.通配符的上界

1.语法:<?extends 父类>

首先准备如下几个类:

Java泛型进阶之通配符_第6张图片

然后进行如下使用

Java泛型进阶之通配符_第7张图片

同样,因为不确定?的具体类型,所以不能进行修改:

Java泛型进阶之通配符_第8张图片

但是可以接收:

Java泛型进阶之通配符_第9张图片

这是发生了向上转型

2.总结:

通配符的上界不能进行写入数据,只可以读取数据

四.通配符的下界

1.语法:

?可以是子类本身,也可以是其父类

Java泛型进阶之通配符_第10张图片

注意,setMessage也可以写为:

Java泛型进阶之通配符_第11张图片

因为实例化message时,传入的类型是Food,即T代表food,所以如果传入一个Apple或Banana或Fruit类型的引用,就i是在进行向上转型

2.注意

1.可以修改,但有限制必须是下线自己或其子类:

Java泛型进阶之通配符_第12张图片

前三行没问题,后面一行是错的,因为我们知道?代表的是Fruit的父类或Fruit本身,所以setMessage传参时传入Fruit的子类或其本身一定是没有问题的,就是一个向上转型,但不可以传入Food,因为Food是Fruit的父类,如果?表示的就是Fruit本身,那么就会出问题

2.不能简简单单接收数据

Java泛型进阶之通配符_第13张图片

Java泛型进阶之通配符_第14张图片

这两个都不可以,因为不知道?是哪个父类

除非进行向下转型:

Java泛型进阶之通配符_第15张图片

但一般不这样用

3.总结:

通配符的下界,不能进行读取数据,只能写入数据

你可能感兴趣的:(java,开发语言,泛型,通配符)