泛型的通配符

泛型的继承

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

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


}
相关推荐
懂点Tech7 小时前
ctfshow misc28:GIF 高度修改解题与脚本实现
开发语言·windows·python
云梦谭9 小时前
让 Linux 主动连接 Windows:配置 Windows 11 SSH 服务端
linux·windows·ssh
奇树谦9 小时前
Windows CMD 下 mc 运维指南:SeaweedFS 安装验收与 MinIO 数据迁移
运维·windows
keren214 小时前
SceneDock:Windows 场景化工作台——一键启动工作链,还能被 AI Agent 调用(CLI / MCP)
windows·开发工具·效率工具·mcp
成旭先生15 小时前
车辆、能源与地理数据 API 实战:把定价、油价、行政区划串成一条链路
人工智能·windows·能源·api集成·油价查询·车辆定价·地址清洗
seahahacsdn17 小时前
Windows获取SYSTEM用户权限的方法应用-计划任务
windows
上海云盾-小余17 小时前
七层 CC 攻击检测难点:如何区分真实用户与攻击请求
网络·人工智能·windows·tcp/ip·udp
2501_9151063218 小时前
Windows 上开发 Unity iOS,使用 KXBuild 进行真机调试、性能采样与打包 ipa
windows·vscode·unity·ios·个人开发·swift·敏捷流程
西柚不烦恼18 小时前
Windows 本地部署私有 AI 全攻略:纯 CPU 环境(Ollama + Open WebUI)
人工智能·windows
少年的范儿18 小时前
Windows 安装 Node.js 教程:nvm 版本管理 + pnpm 安装配置
windows·npm·node.js