基本概念
对泛型不了解的可以看这篇博客:数据结构前瞻-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();