【Java集合进阶】泛型的通配符和综合练习

🍬 博主介绍👨‍🎓 博主介绍:大家好,我是 hacker-routing ,很高兴认识大家~
✨主攻领域:【渗透领域】【应急响应】 【Java】 【VulnHub靶场复现】【面试分析】
🎉点赞➕评论➕收藏 == 养成习惯(一键三连)😋
🎉欢迎关注💗一起学习👍一起讨论⭐️一起进步📝文末有彩蛋
🙏作者水平有限,欢迎各位大佬指点,相互学习进步!

目录

泛型的继承和通配符

动物集合练习

总结


泛型的继承和通配符

  • 泛型不具备继承性,但是数据具备继承性
     *      ?也表示不确定的类型*      他可以进行类型的限定*      ? extends E: 表示可以传递E或者E所有的子类类型*      ? super E:表示可以传递E或者E所有的父类类型public static<E> void method(ArrayList<? extends GenericsDemo5.Ye> list){}

泛型类GenericsDemo5

package list;import java.util.ArrayList;public class GenericsDemo5 {public void main(String[] args) {/*泛型不具备继承性,但是数据具备继承性*///创建集合的对象ArrayList<Ye> list1 = new ArrayList<Ye>();ArrayList<Fu> list2 = new ArrayList<Fu>();ArrayList<Zi> list3 = new ArrayList<Zi>();//调用method方法method(list1);//method(list2);//数据继承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{}
}

泛型类:GenericsDemo6

package list;import java.util.ArrayList;public class GenericsDemo6 {public static void main(String[] args) {/**   需求:*       定义一个方法,形参是一个集合,但是集合中的数据类型不确定。** *///创建集合的对象ArrayList<GenericsDemo5.Ye> list1 = new ArrayList<GenericsDemo5.Ye>();ArrayList<GenericsDemo5.Fu> list2 = new ArrayList<GenericsDemo5.Fu>();ArrayList<GenericsDemo5.Zi> list3 = new ArrayList<GenericsDemo5.Zi>();method(list1);method(list2);method(list3);}/** 此时,泛型里面写的是什么类型,那么只能传递什么类型的数据。* 弊端:*      利用泛型方法有一个小弊端,此时他可以接受任意的数据类型*      Ye  Fu   Zi    Student** 希望:本方法虽然不确定类型,但是以后我希望只能传递Ye Fu Zi** 此时我们就可以使用泛型的通配符:*      ?也表示不确定的类型*      他可以进行类型的限定*      ? extends E: 表示可以传递E或者E所有的子类类型*      ? super E:表示可以传递E或者E所有的父类类型** 应用场景:*      1.如果我们在定义类、方法、接口的时候,如果类型不确定,就可以定义泛型类、泛型方法、泛型接口。*      2.如果类型不确定,但是能知道以后只能传递某个继承体系中的,就可以泛型的通配符* 泛型的通配符:*      关键点:可以限定类型的范围。** */public static<E> void method(ArrayList<? extends GenericsDemo5.Ye> list){}
}

动物集合练习

test1测试类:

package Test;import java.util.ArrayList;
import java.util.List;public class test1 {public static void main(String[] args) {/*需求:定义一个继承结构:动物|                           |猫                          狗|      |                    |      |波斯猫   狸花猫                泰迪   哈士奇属性:名字,年龄行为:吃东西波斯猫方法体打印:一只叫做XXX的,X岁的波斯猫,正在吃小饼干狸花猫方法体打印:一只叫做XXX的,X岁的狸花猫,正在吃鱼泰迪方法体打印:一只叫做XXX的,X岁的泰迪,正在吃骨头,边吃边蹭哈士奇方法体打印:一只叫做XXX的,X岁的哈士奇,正在吃骨头,边吃边拆家测试类中定义一个方法用于饲养动物public static void keepPet(ArrayList<???> list){//遍历集合,调用动物的eat方法}要求1:该方法能养所有品种的猫,但是不能养狗要求2:该方法能养所有品种的狗,但是不能养猫要求3:该方法能养所有的动物,但是不能传递其他类型*/ArrayList<lihuaCat> list1 = new ArrayList<>();ArrayList<hashiqiDog> list2 = new ArrayList<>();//        keepPet(List1);
//        keepPet(List2);}//该方法能养所有的动物,但是不能传递其他类型public static void keepPet(ArrayList<? extends Animal> list){//遍历集合,调用动物的eat方法}/*  //  要求2:该方法能养所有品种的狗,但是不能养猫public static void keepPet(ArrayList<? extends Dog> list){//遍历集合,调用动物的eat方法}*//*//要求1:该方法能养所有品种的猫,但是不能养狗public static void keepPet(ArrayList<? extends Cat> list){//遍历集合,调用动物的eat方法}*/}

爷 类:Animal

package Test;public abstract class Animal {private String name;private int age;public Animal() {}public Animal(String name, int age) {this.name = name;this.age = age;}/*** 获取* @return name*/public String getName() {return name;}/*** 设置* @param name*/public void setName(String name) {this.name = name;}/*** 获取* @return age*/public int getAge() {return age;}/*** 设置* @param age*/public void setAge(int age) {this.age = age;}public abstract void eat();public String toString() {return "Animal{name = " + name + ", age = " + age + "}";}
}

父类:Cat

package Test;public abstract class Cat extends Animal{}

子类:bosiCat

package Test;public class bosiCat extends Cat{@Overridepublic void eat() {System.out.println("一只叫做" + getName() + "的" + getAge() + "岁的波斯猫,正在吃小饼干");}
}

子类:lihuaCat

package Test;public class lihuaCat extends Cat{@Overridepublic void eat() {System.out.println("一只叫做" + getName() + "的" + getAge() + "岁的狸花猫,正在吃小鱼干");}
}

父类:Dog

package Test;public abstract class Dog extends Animal{}

子类:taidiDog

package Test;public class taidiDog extends Dog{@Overridepublic void eat() {System.out.println("一只叫做" + getName() +"的" + getAge()+"岁的泰迪,正在吃骨头,边吃边蹭");}
}

子类:hashiqiDog

package Test;public class hashiqiDog extends Dog{@Overridepublic void eat() {System.out.println("一只叫做" + getName() +"的" + getAge()+"岁的哈士奇,正在吃骨头,边吃边蹭");}
}

总结

1.什么是泛型?

  • 并进行检查JDK5引入的特性,可以在编译阶段约束操作的数据类型

2.泛型的好处?

  • 统一数据类型

  • 把运行时期的问题提前到了编译期间,避免了强制类型转换可能出现的异常,因为在编译阶段类型就能确定下来

3.泛型的细节?

  • 泛型中不能写基本数据类型

  • 可以传入该类型和他的子类类型指定泛型的具体类型后,传递数据时,

  • 如果不写泛型,类型默认是Object

4.哪里定义泛型?

  • 泛型类:在类名后面定义泛型,创建该类对象的时候,确定类型
  • 泛型方法:在修饰符后面定义方法,调用该方法的时候,确定类型
  • 泛型接口:在接口名后面定义泛型实现类确定类型,实现类延续泛型

5.泛型的继承和通配符

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

  • 泛型的通配符:?

    ? extend E

    ? super E

6.使用场景

  • 定义类、方法、接口的时候,如果类型不确定,就可以定义泛型
  • 如果类型不确定,但是能知道是哪个继承体系中的,可以使用泛型的通配符

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/301041.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

xss.pwnfunction-Jefff

在eval中可以直接执行命令所以直接把"直接闭合在结尾再加上一个"因为后面的"没闭和会报错 ?jeffa";alert(1);" 或 ?jeffa"-alert(1)-" -是分隔符

全面解析十七种数据分析方法,具象数据分析思维

本文干货信息汇总&#xff1a;FineBI自助式BI数据分析工具下载>>https://s.fanruan.com/vfp40FineBI数据分析模板库>>https://s.fanruan.com/fnbjg 一、介绍 在当今数据驱动的商业环境中&#xff0c;数据分析已经成为了企业获取竞争优势的关键工具。无论是为了优化…

模型融合的方法

集成学习&#xff1a;通过构建并结合多个学习器来完成学习任务&#xff0c;有时也被称为多分类器系统、基于委员会的学习等。&#xff08;集成学习不是只有同质学习器的集成&#xff0c;还有异质学习器的集成&#xff09; 模型融合&#xff1a;通过多个模型共同决策提升任务的…

阿里云乱扣费故障,技术堪忧

2024年4月3日&#xff0c;距离2023年11月的故障没有多久&#xff0c;阿里云又出现乱扣费故障&#xff0c;导致账号欠费3000多&#xff0c;oss&#xff0c;块存储&#xff0c;cdn等所有后付费服务停止工作&#xff0c;不知道这个故障能算什么级别的。 凌晨1点多&#xff0c;收到…

09 flink-sql 中基于 mysql-cdc 的 select * from test_user 的具体实现

前言 这也是最近帮一个朋友看问题 遇到的一个问题 然后 引发了一下 对于 flink-sql 里面的一些 常规处理的思考, 理解 原始问题主要是 在测试库可以使用 flink-sql 可以正常同步, 但是 在生产环境 无法正常同步数据 这个问题 我们后面单独 记录一篇文章 测试用例 下载…

代码随想录算法训练营第48天|198.打家劫舍|213.打家劫舍II| 337.打家劫舍III

代码随想录算法训练营第48天|198.打家劫舍|213.打家劫舍II| 337.打家劫舍III 今天就是打家劫舍的一天&#xff0c;这个系列不算难&#xff0c;大家可以一口气拿下。 198.打家劫舍 视频讲解&#xff1a;https://www.bilibili.com/video/BV1Te411N7SX https://programmercarl.c…

系统架构评估_2.SAAM方法

SAAM&#xff08;Scenarios-based Architecture Analysis Method&#xff09;是卡耐基梅隆大学软件工程研究所&#xff08;SEI at CMU&#xff09;的Kazman等人于1983年提出的一种非功能质量属性的架构分析方法&#xff0c;是最早形成文档并得到广泛使用的软件架构分析方法。最…

大语言模型上下文窗口初探(下)

由于篇幅原因&#xff0c;本文分为上下两篇&#xff0c;上篇主要讲解上下文窗口的概念、在LLM中的重要性&#xff0c;下篇主要讲解长文本能否成为LLM的护城河、国外大厂对长文本的态度。 3、长文本是护城河吗&#xff1f; 毫无疑问&#xff0c;Kimi从一开始就用“长文本”占领…

电脑硬件 - 硬盘

硬盘是一台电脑的数据中心&#xff0c;存放着我们用户的所有文件和数据 对于一块硬盘&#xff0c;其重要指标&#xff1a;顺序读写能力&#xff0c;随机读写能力 顺序读写影响大文件的拷贝&#xff0c;随机读写影响大量小文件的拷贝&#xff08;打开软件的快慢&#xff09; 因…

揭秘Symfony DomCrawler库的爬虫魔力:获取网易新闻热点

在这个信息爆炸的时代&#xff0c;新闻热点不仅仅是传递信息的渠道&#xff0c;它们还能够影响和引导公众舆论。Symfony DomCrawler库作为一个强大的爬虫工具&#xff0c;可以帮助我们理解这种现象&#xff0c;通过获取和分析网易新闻热点&#xff0c;我们可以洞察舆情的走向。…

系统监测工具-tcpdump的使用

一个简单的tcpdump抓包过程。主要抓包观察三次握手&#xff0c;四次挥手的数据包 有两个程序&#xff1a;客户端和服务器两个程序 服务器端的ip地址使用的是回环地址127.0.0.1 端口号使用的是6000 tcpdump -i 指定用哪个网卡等&#xff0c;dstip地址端口指定抓取目的地址…

【SpringBoot整合系列】SpringBoot整合FastDFS(二)

目录 SpringBoot整合FastDFSJava客户端/依赖常用api接口解释1.uploadFile参数返回值 2.uploadSlaveFile参数返回值 3.getMetadata参数返回值 4.overwriteMetadata参数&#xff1a;返回值&#xff1a;无 5.mergeMetadata参数&#xff1a;返回值&#xff1a;无 6.queryFileInfo参…

Nacos Namespace 未授权访问漏洞

Nacos Namespace 未授权访问漏洞 问题 nacos 源码启动&#xff0c;发现即使开启了鉴权&#xff1a;nacos.core.auth.enabledtrue&#xff0c;未登录情况下&#xff0c;命名空间列表接口仍旧能查询到数据 鉴权逻辑 通过**AuthFilter **进行权限校验判断方法上是否存在注解 …

idea开发 java web 疫情信息查询系统bootstrap框架web结构java编程计算机网页接口查询

一、源码特点 java 疫情信息查询系统是一套完善的完整信息系统&#xff0c;结合java web开发和bootstrap UI框架完成本系统 &#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。 前段主要技术 css j…

深入理解GO语言——GC垃圾回收二

文章目录 前言一、Go V1.5的三色并发标记法总结 前言 书接上回&#xff0c;无论怎么优化&#xff0c;Go V1.3都面临这个一个重要问题&#xff0c;就是mark-and-sweep 算法会暂停整个程序 。 Go是如何面对并这个问题的呢&#xff1f;接下来G V1.5版本 就用 三色并发标记法 来优…

python开发poc2,爆破脚本

#本课知识点和目的&#xff1a; ---协议模块使用&#xff0c;Request 爬虫技术&#xff0c;简易多线程技术&#xff0c;编码技术&#xff0c;Bypass 后门技术 下载ftp服务器模拟器 https://lcba.lanzouy.com/iAMePxl378h 随便创建一个账户&#xff0c;然后登录进去把ip改成…

战争中的AI应用:道德、伦理与技术的交织

AI在战争中的应用是一个极具争议和复杂的话题&#xff0c;无法简单地回答是好还是坏。其影响取决于多个因素&#xff0c;包括使用方式、目的、伦理框架以及技术本身的发展水平。 一方面&#xff0c;AI在战争中具有潜在的积极作用。它可以提高军事行动的效率和精确性&#xff0c…

【MySQL】游标和触发器

一、游标 1.1 什么是游标 1、使用背景 在我们使用update或者delete操作数据时&#xff0c;一般都会根据条件语句查询出很多条记录组成的数据集&#xff0c;然后一次性批量操作 假设我们想要对这个结果集中的数据 一行一行的进行操作&#xff0c;比如某个条件满足后&#xff…

计算机毕业设计java 基于Android的拼图游戏app

当今社会&#xff0c;随着电子信息技术的发展&#xff0c;电子游戏也成为人们日常生活的一部分。这种娱乐方式结合了日新月异的技术&#xff0c;在游戏软件中结合了多种复杂技术。拼图游戏流行在各种电子产品上&#xff0c;从计算机&#xff0c;掌上游戏机到如今的手机&#xf…

Vue中的键盘事件

目 录 1. 概述 2. JavaScript 键盘事件 2.1 键盘事件类型 2.1.1 keydown 事件2.1.2 keypress 事件2.1.3 keyup 事件2.1.4 input 事件 2.2 键盘事件的响应顺序 3. Vue 键盘事件监听与处理 3.1 获取按键的 键码&#xff08;keyCode&#xff09;3.2 监听按键事件 4. Vue 按键…