当前位置: 首页 > news >正文

泛型的通配符

泛型的继承

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

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();@Overridepublic 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{@Overridepublic void eat() {System.out.println("一只叫"+getName()+"的,"+getAge()+"岁的哈士奇,正在吃骨头,边吃边拆家");}
}
public class TedyDog extends Dog{@Overridepublic void eat() {System.out.println("一只叫"+getName()+"的,"+getAge()+"岁的泰迪,正在吃骨头,边吃边蹭");}
}
public class PersianCat extends Cat{public PersianCat(String name,int age){super(name,age);}@Overridepublic void eat() {System.out.println("一只叫"+getName()+"的,"+getAge()+"岁的波斯猫,正在吃小饼干");}
}
public class LiHuaCat extends Cat{public LiHuaCat(String name,int age){super(name,age);}@Overridepublic 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();}}}

http://www.dtcms.com/a/366815.html

相关文章:

  • axios请求缓存与重复拦截:“相同请求未完成时,不发起新请求”
  • TDengine TIMETRUNCATE 函数用户使用手册
  • 野火STM32Modbus主机读取寄存器/线圈失败(三)-尝试将存贮事件的地方改成数组(非必要解决方案)(附源码)
  • 腾讯云国际代理:如何在腾讯云GPU服务器上部署私有化大模型?附GPU简介
  • SQLmap 完整使用指南:环境搭建 + 命令详解 + 实操案例
  • 打开 solidworks当前文件 所在的文件夹 python pywin32
  • Effective Python 第10条 - 用赋值表达式减少重复代码
  • 上位机知识篇---conda run
  • KingbaseES一体化架构与多层防护体系如何保障企业级数据库的持续稳定与弹性扩展
  • 关于在自然语言处理深层语义分析中引入公理化体系的可行性、挑战与前沿展望
  • 谁才是企业级开源平台的优选?OpenCSG与Dify、Coze、Langflow、Ollama 的差异化之路
  • 深度学习——ResNet 卷积神经网络
  • 高并发商城 商品为了防止超卖,都做了哪些努力?
  • 2025国赛C题保姆级教程思路分析 NIPT 的时点选择与胎儿的异常判定
  • Spring Cloud Alibaba快速入门01
  • C语言结构体:轻松管理球员数据
  • SpringMVC的异常处理和拦截器
  • 【C语言】深入理解指针(4)
  • nextcyber——常见应用攻击
  • 一个老工程师的“新生”:良策金宝AI,让我重新爱上设计
  • [光学原理与应用-389]:设计 - 深紫外皮秒脉冲激光器 - 元件 - 1064nm种子光准直透镜
  • 2025年经管领域专业资格认证发展路径分析
  • 数据结构 之 【模拟实现哈希表】
  • Python 值传递 (Pass by Value) 和引用传递 (Pass by Reference)
  • 电池预测 | 第36讲 Matlab基于CNN-BiGRU-Attention的锂电池剩余寿命预测
  • JVM 运行时数据区域
  • 开源本地LLM推理引擎(Cortex AI)
  • 【PZ-AU15P】璞致fpga开发板 Aritx UltraScalePlus PZ-AU15P 核心板与开发板用户手册
  • ZooKeeper核心ZAB选举核心逻辑(大白话版)
  • 性能堪比claude sonnet4,免费无限使用!claude code+魔搭GLM4.5在ubuntu上安装完整流程