对泛型不了解的可以看这篇博客:数据结构前瞻-CSDN博客
一般来说,?在泛型里的使用就是通配符
看看下面的代码
- class Message
{ - 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
message = new Message<>() ; - message.setMessage("比特就业课欢迎您");
- fun(message);
- }
- public static void fun(Message
temp) { - System.out.println(temp.getMessage());
- }
- }
现在我们想让程序打印另一条消息,类型是Integer,这么一搞直接报错了

因为我们的fun函数已经限定传入的必须是String类型,那我们要打印Integer怎么办呢?
把String换成?表示程序也不知道要打印哪种类型,那不就可以打印所有类型了吗

但是这样做就不能在fun里面setMessage了,因为传入的temp也不知道是什么类型
语法
- extends 上界>
- extends Number>//可以传入的实参类型是Number或者Number的子类
例子

定义盘子泛型,可以放入Apple和Banana等水果
- class Plate
{ // 设置泛型 - 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
plate = new Plate<>(); - Plate
plate1 = new Plate<>(); - fun(plate);
- fun(plate1);
- }
- super 下界>
- super Integer>//代表 可以传入的实参的类型是Integer或者Integer的父类类型

为什么这里会报错呢?
因为temp.getMessage()拿到的是Fruit的父类Food,跟前面的Fruit类型不匹配?
不匹配就强制让它匹配,强转一下就可以运行了
Fruit fruit = (Fruit) temp.getMessage();