基本概念
对泛型不了解的可以看这篇博客:数据结构前瞻-CSDN博客
一般来说,?在泛型里的使用就是通配符
看看下面的代码
class Message<T> {private T message ;public T getMessage() {return message;}public void setMessage(T message) {this.message = message;}
}
public class Test {public static void main(String[] args) {Message<String> message = new Message<>() ;message.setMessage("比特就业课欢迎您");fun(message);}public static void fun(Message<String> temp){System.out.println(temp.getMessage());}
}
现在我们想让程序打印另一条消息,类型是Integer,这么一搞直接报错了
因为我们的fun函数已经限定传入的必须是String类型,那我们要打印Integer怎么办呢?
把String换成?表示程序也不知道要打印哪种类型,那不就可以打印所有类型了吗
但是这样做就不能在fun里面setMessage了,因为传入的temp也不知道是什么类型
通配符上界
语法
<? extends 上界>
<? extends Number>//可以传入的实参类型是Number或者Number的子类
例子
定义盘子泛型,可以放入Apple和Banana等水果
class Plate<T> { // 设置泛型private T message ;public T getMessage() {return message;}public void setMessage(T message) {this.message = message;}}
定义通配符上界
public static void fun(Plate<? extends Fruit> temp){Fruit fruit = temp.getMessage();//向上转型System.out.println(fruit);}
public static void main(String[] args) {Plate<Apple> plate = new Plate<>();Plate<Banana> plate1 = new Plate<>();fun(plate);fun(plate1);}
通配符下界
<? super 下界>
<? super Integer>//代表 可以传入的实参的类型是Integer或者Integer的父类类型
为什么这里会报错呢?
因为temp.getMessage()拿到的是Fruit的父类Food,跟前面的Fruit类型不匹配?
不匹配就强制让它匹配,强转一下就可以运行了
Fruit fruit = (Fruit) temp.getMessage();