泛型的通配符

泛型的继承

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

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


}
相关推荐
梦帮科技34 分钟前
OpenClaw 桥接调用 Windows MCP:打造你的 AI 桌面自动化助手
人工智能·windows·自动化
春日见2 小时前
如何创建一个PR
运维·开发语言·windows·git·docker·容器
C++ 老炮儿的技术栈2 小时前
VS2015 + Qt 实现图形化Hello World(详细步骤)
c语言·开发语言·c++·windows·qt
浩浩测试一下3 小时前
内网---> WriteOwner权限滥用
网络·汇编·windows·安全·microsoft·系统安全
一个人旅程~3 小时前
Dell n4020双系统分区步骤和linux优化操作
linux·windows·电脑
love530love4 小时前
【高阶编译】Windows 环境下强制编译 Flash Attention:绕过 CUDA 版本不匹配高阶指南
人工智能·windows·python·flash_attn·flash-attn·flash-attention·定制编译
勾股导航4 小时前
Windows安装GPU环境
人工智能·windows·gnu
x***r1514 小时前
PhpStudy2018怎么用?完整安装与使用指南(新手必看)
windows
一品人家10 小时前
win32汇编使用GDI+入门教程之九
汇编·windows·win32汇编
小天源15 小时前
Error 1053 Error 1067 服务“启动后立即停止” Java / Python 程序无法后台运行 windows nssm注册器下载与报错处理
开发语言·windows·python·nssm·error 1053·error 1067