泛型的通配符

发布于:2025-09-05 ⋅ 阅读:(16) ⋅ 点赞:(0)

泛型的继承

●泛型不具备继承性,但是数据具备继承性

public class GenericsDemo5 {
    public static void main(String[] args) {

        ArrayList<Ye> list1 = new ArrayList<>();
        ArrayList<Fu> list2 = new ArrayList<>();
        ArrayList<Zi> list3 = new ArrayList<>();


        // method(list1);
        // method(list2);//报错
        // method(list3);//报错

        list1.add(new Ye());
        list1.add(new Fu());
        list1.add(new Zi());

    }
    //此时,泛型里面写的是什么类型,那么只能传递什么类型的数据。
    public static void method(ArrayList<Ye> list){

    }

}

class Ye{}
class Fu extends Ye{}
class Zi extends Fu{}


希望:本方法虽然不确定类型,但是以后我希望只能传递指定类型

     此时我们就可以使用泛型的通配符:

        ?也表示不确定的类型,他可以进行类型的限定

        ? extends E:表示可以传递E或者E所有的子类类型

        ? supler E:表示可以传递E或者E所有的父类类型

public class GenericsDemo5 {
    public static void main(String[] args) {

        ArrayList<Ye> list1 = new ArrayList<>();
        ArrayList<Fu> list2 = new ArrayList<>();
        ArrayList<Zi> list3 = new ArrayList<>();


         method(list1);
         method(list2);
         method(list3);

    }

    public static void method(ArrayList<? super Zi> list){

    }

}

class Ye{}
class Fu extends Ye{}
class Zi extends Fu{}

应用场景:

1.如果我们在定义类、方法、接口的时候,如果类型不确定,就可以定义泛型类、泛型方法、泛型接口。2.如果类型不确定,但是能知道以后只能传递某个继承体系中的,就可以泛型的通配符

泛型的通配符:

关键点:可以限定类型的范围。

通配符综合练习代码:

动物类

public abstract class Animal {
    private String name;
    private int age;

    public Animal(){
    }

    public Animal(String name,int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public abstract void eat();

    @Override
    public String toString() {
        return "Animal{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

猫
public abstract class Cat extends Animal{
   public Cat(String name,int age){
        super(name, age);
    }


    //1.继承抽象类,重写里面的所有抽象方法
    //2.本身Cat也是一个抽象的,让Cat的子类重写重写方法

    //采取第二种方法
    //因为猫的两个子类中的eat的方法还是不一样的
}
狗
public abstract class Dog extends Animal{
}
public class HuskyDog extends Dog{
    @Override
    public void eat() {
        System.out.println("一只叫"+getName()+"的,"+getAge()+"岁的哈士奇,正在吃骨头,边吃边拆家");
    }
}
public class TedyDog extends Dog{
    @Override
    public void eat() {
        System.out.println("一只叫"+getName()+"的,"+getAge()+"岁的泰迪,正在吃骨头,边吃边蹭");
    }
}
public class PersianCat extends Cat{
    public PersianCat(String name,int age){
        super(name,age);
    }



    @Override
    public void eat() {
        System.out.println("一只叫"+getName()+"的,"+getAge()+"岁的波斯猫,正在吃小饼干");
    }
}
public class LiHuaCat extends Cat{
    public LiHuaCat(String name,int age){
        super(name,age);
    }


    @Override
    public void eat() {
        System.out.println("一只叫"+getName()+"的,"+getAge()+"岁的狸花猫,正在吃鱼");
    }
}
测试
public class Test1 {
    public static void main(String[] args) {

       ArrayList<PersianCat> list1 = new ArrayList<>();
        ArrayList<LiHuaCat> list2 = new ArrayList<>();
        ArrayList<TedyDog> list3 = new ArrayList<>();
        ArrayList<HuskyDog> list4 = new ArrayList<>();

       list1.add(new PersianCat("小花",10));
       list2.add(new LiHuaCat("小白",11));

        keePet(list1);
        keePet(list2);


       // keePet(list3);
       // keePet(list4);
    }

   /* //该方法能养所有动物,但不能传递其他类型
    public static void keePet(ArrayList<? extends Animal> list){
        //遍历集合,调用动物eat方法
    }

    */

  /*  //该方法能养所有品种的狗,但是不能养猫
    public static void keePet(ArrayList<? extends Dog> list){

    }

   */

    //该方法能养所有品种的猫,但是不能养狗
    public static void keePet(ArrayList<? extends Cat> list){
        for (Cat cat : list) {
            cat.eat();
        }
    }


}


网站公告

今日签到

点亮在社区的每一天
去签到