一.通配符用于解决什么问题
首先给出一个泛型类:
然后写一个静态方法,并在main方法之中进行调用:
可以正常使用func方法并打印出hello
但要是又实例化了其他类型的message,就出现问题了:
所以我们写的这个func方法只能被某些Message成员调用,那该如何解决?
这就要用到通配符 ,即问号。
二.通配符的使用
我们用通配符来修改上述func方法,就不会报错啦:
这里使用通配符“?”描述的是它可以接收任何类型
注意:
由于不确定是什么类型,就无法进行修改:
这是错误的。
三.通配符的上界
1.语法:<?extends 父类>
首先准备如下几个类:
然后进行如下使用
同样,因为不确定?的具体类型,所以不能进行修改:
但是可以接收:
这是发生了向上转型
2.总结:
通配符的上界不能进行写入数据,只可以读取数据
四.通配符的下界
1.语法:<? super 子类>
?可以是子类本身,也可以是其父类
注意,setMessage也可以写为:
因为实例化message时,传入的类型是Food,即T代表food,所以如果传入一个Apple或Banana或Fruit类型的引用,就i是在进行向上转型
2.注意
1.可以修改,但有限制必须是下线自己或其子类:
前三行没问题,后面一行是错的,因为我们知道?代表的是Fruit的父类或Fruit本身,所以setMessage传参时传入Fruit的子类或其本身一定是没有问题的,就是一个向上转型,但不可以传入Food,因为Food是Fruit的父类,如果?表示的就是Fruit本身,那么就会出问题
2.不能简简单单接收数据
这两个都不可以,因为不知道?是哪个父类
除非进行向下转型:
但一般不这样用
3.总结:
通配符的下界,不能进行读取数据,只能写入数据