通配符:?
?可以在“使用泛型”的时候代表一切类型
ETKV是在定义泛型的的时候使用的
案例
举办一个赛车比赛所以的车都可以参加(只是通配符语法介绍)
先定义一个汽车类
//汽车类
class Car{
}
定义一个宝马和奔驰类继承汽车类
//宝马类继承汽车类
class BMW extends Car{
}
//奔驰类继承汽车类
class Benz extends Car{
}
在定义一个狗类,用于测试语法(泛型上限的问题)
//定义一个狗类
class Dog{
}
定义一个汽车赛跑的方法
//汽车比赛
public static void compet(ArrayList<Benz> cars ){ //这么写奔驰能进来宝马进不来
}
//汽车比赛
public static void compet(ArrayList<BMW> cars ){ //这么写宝马能进来,奔驰进不来
}
有的人会说那我直接写car不就都进来了,可以试一下
//汽车比赛
public static void compet(ArrayList<Car> cars ){ //这么一写都进不来了
}
所以虽然BMW和BENZ都继承了Car但是ArrayList<BMW>和ArrayList<Car>没有关系的
这是后就要使用通配符?
public static void compet(ArrayList<?> cars) {//这么一写都进不来了
}
但是你发现要是没有限制,别说汽车了我狗都可以进来 所以后来又有了上下限问题
public class Test {
public static void main(String[] args) {
// TODO Auto-generated method stub
ArrayList<Benz> benzs=new ArrayList();
benzs.add(new Benz()); //加一辆奔驰车
ArrayList<BMW> bmws=new ArrayList();
bmws.add(new BMW());
compet(benzs);
compet(bmws);
ArrayList<Dog> dogs=new ArrayList<>();
dogs.add(new Dog());
compet(dogs);
}
//汽车比赛
public static void compet(ArrayList<?> cars) {//这么一写不管什么东西都能进来了所以还有优化才有了上下限问题
}
}
这时候就要使用上下限
?extends Car:必须是Car或其子类 泛型上限 (用的多)
?super Car: 必须是Car或其父类 泛型下限
//汽车比赛
public static void compet(ArrayList<? extends Car> cars) {//这么一写都进不来了
}
这是后只有汽车可以进来狗就进步来了