泛型的通配符

泛型的继承

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

复制代码
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();
        }
    }


}
相关推荐
XUHUOJUN14 小时前
Windows 2025架构深度分析之Stretch Cluster 延迟工程现实
windows·microsoft·架构·azure local
love530love15 小时前
将 ChatCut MCP 插件从 Codex 桌面应用移植到 WorkBuddy —— 完整适配实录
ide·人工智能·windows·视频剪辑·ai agent
works cart16 小时前
windows常用命令
windows
浩浩测试一下17 小时前
windows 加壳工具代码实现02 - 加壳界面实现MFC
windows·mfc·免杀·加壳器·pe应用
崖边看雾21 小时前
记录Python学习——第一章环境安装下载(Windows)
windows·python·学习·pycharm
sukalot1 天前
windows网络适配器驱动开发-NetAdapterCx 接收端缩放(中)
windows·驱动开发
我是Superman丶1 天前
Windows系统FFmpeg官方下载+完整安装配置保姆级教程(2026最新版)
windows·ffmpeg
weixin_433417671 天前
TortoiseGit推送到远端,如何配置
windows·git
2601_962364971 天前
Windows Hello VS 传统密码:身份认证安全层级全面对比分析
windows·安全·电脑
Imagine Miracle2 天前
【WSL】让WSL2后台持久运行不自动关闭的解决方案
linux·windows·wsl