泛型的通配符和上下限

需求: 开发一个*飞车的游戏,所有的汽车都能一起参与比赛。

注意:

  虽然BMW和BENZ都继承了Car

  但是ArrayList<BMW>和ArrayLIst<BENZ>与ArrayList<Car>没有关系的!泛型没有继承关系!

  通配符:?

      ? 可以用在使用泛型的时候代表一切类型。

      E,T,K,V是在定义泛型的时候使用代表一切类型。

 泛型的上下限:

    ? extends Car : 那么?必须是Car或者其子类。(泛型的上限)

    ? super Car: 那么?必须是Car或者其父类。(泛型的下限。不是很常见)

   代码:

  

package com.ithei.泛型的通配符;

/**
 * @program: javaDemo01->Test
 * @description: 泛型的通配符
 * @author: 安生
 * @create: 2021-01-25 14:48
 **/

import java.util.ArrayList;

/**
  需求:  开发一个*飞车的游戏,所有的汽车都能一起参与比赛。

 */
public class Test {

    public static void main(String[] args) {
        ArrayList<BENZ> benzs = new ArrayList<>();
        benzs.add(new BENZ());
        benzs.add(new BENZ());
        run(benzs);

        ArrayList<BMW> bmws = new ArrayList<>();
        bmws.add(new BMW());
        bmws.add(new BMW());
        run(bmws);

        ArrayList<Dog> dogs = new ArrayList<>();
        dogs.add(new Dog());
        dogs.add(new Dog());
        //run(dogs);// 例如 这里如果不约束 就会出现狗与车一起参加赛车比赛的情况 不够严谨
    }

    //定义一个方法 让多辆车可以一起进入赛道!
    //这里在使用的时候 就用? 泛型的通配符  这样解决了出入问题  但是能出入还不够 还要约束一下
    //否则这里就有可能出现不严谨的情况
    //所以这里添加了泛型通配符的上限
    public static void run(ArrayList<? extends Car> cars){

    }
}
//首先定义一个汽车类
class Car{

}
//定义宝马
class BENZ extends Car{

}
//定义奔驰
class BMW extends Car{

}
//定义狗
class Dog{

}