Java学习笔记29(泛型)

news2024/11/27 0:20:41

1.泛型

ArrayList<Dog> arrayList = new ArrayList<Dog>();
//1.当我们ArrayList<Dog>表示存放到ArrayList集合中的元素是Dog类
//2.如果编译器发现添加的类型,不满足要求,就会报错
//3.在便利的时候,可以直接取出Dog类型而不是Object
arrayList.add(new Dog("旺财",10));
arrayList.add(new Dog("小法",1));

for(Dog dog : arrayList) {
    System.out.println(dog.name +" " + dog.age);
}

*泛型的好处

1.编译时,检查添加元素的类型,提高了安全性

2.减少了类型转换的次数,提高了效率

在这里插入图片描述

1.泛型介绍

​ *泛型(广泛的类型) --> Integer,String,Dog

​ public class ArrayList{} //E成为泛型

1.泛型又称参数化类型,解决数据类型的安全性问题

2.在类声明或实例化时只要指定好需要的具体的类型即可

3.Java泛型可以保证如果程序在编译时没有发出警告,运行时就不会产生ClassCastException异常

4.泛型的作用:可以在类声明时通过一个标识表示类中某个属性的类型,或者是某个方法的返回值的类型,或者是参数类型

class Person<E> {
    E s;//E表示s的数据类型,该数据类型在定义Person对象的时候指定,即在编译期间,就确定E是什么类型
    
    public Person(E s) {//E也可以是参数类型
        this.s = s;
    }
    
    public E f() {//返回类型使用E
        return s;
    }
}

2.泛型的声明

interface 接口{} 和class 类 <T,V>{}

​ *说明

1.其中,T,K,V不代表值,而是表示类型

2.任意字母都可以,常用T表示,是Type的缩写

​ *泛型的实例化:

1.List strList = new ArrayList();

2.Iterator iterator = customers.iterator();

//使用泛型方式给HashMap放入学生对象
HashMap<String, Student> hm = new HashMap<String, Student>();
hm.put("tom", new Student("tom",28));

Set<Map.Entry<String, Student>> entries = hm.entrySet();
Iterator<Map.Entry<String,Student>> iterator = entries.iterator();

3.泛型注意细节

1.<>内只能放引用类型Integer之类的,不能是int之类的基本数据类型

2.在给泛型指定具体类型后,可以传入该类型或其子类类型

class A{}
class B extends A{}

class Pig<E> {
    E e;
    public Pig(E e) {
        this.e = e;
    }
}

main()
{
    Pig<A> aPig = new Pig<A>(new A());
    Pig<A> aPig2 = new Pig<A>(new B());
}

3.如果没有指定泛型,默认是Object

ArrayList arrayList = new ArrayList();//等价 ArrayList<Object> arrayList = new ArrayList();

4.自定义泛型

​ *基本语法

class 类名<TR...> {//...表示可以有多个泛型
	成员
}

1.普通成员可以使用泛型(属性、方法)

2.使用泛型的数组,不能初始化

3.静态方法中不能使用类的泛型

4.泛型类的类型,是在创建对象时确定的

5.未指定泛型,默认为Object

//1.Tiger后面有泛型,所有把Tiger成为自定义泛型类
//2.T、R、M泛型的标识符,一般是单个大写字母
//3.泛型标识符可以有多个
//4.普通成员可以使用泛型(属性、方法)
class Tiger<TRM> {
    String name;
    R r;
    M m;
    T t;
}

5.自定义泛型接口

​ *基本语法

interface 接口名<T,R...> {
    
}

1.接口中,静态成员也不能使用泛型

2.泛型接口的类型,在继承接口或者实现接口时确定

3.没有指定类型,默认为Object

interface IUsb<U,R> {
    
}

//继承接口时,直接指定泛型接口的类型
interface IA extends IUsb<String,Double> {	//String指定给U,Double指定给R
    
}

//实现接口时,直接指定泛型接口的类型
class BB implements IUsb<Integer,Float> {
    
}

6.自定义泛型方法

​ *基本语法

修饰符 <T,R...> 返回类型 方法名(参数列表) {
	
}

1.泛型方法,可以定义在普通类中,也可以定义在泛型类中

2.当泛型方法被调用时,类型会确定

3.public void eat(E e) {},修饰符后没有<T,R…> eat方法不是泛型方法,而是使用了泛型

class Car {//普通类
    public <T,R> void fly(T t,R r) {//泛型方法

    }
}

class Fish<T,R> {//泛型类
    public <U,M> void eat(U u,M m) {//泛型方法

    }
}

main()
{
	Car car = new Car();
    car.fly("宝马",100);//当调用方法时,传入参数,编译器就会确定类型
}

7.泛型的继承和通配符

1.泛型不具备继承性

List<Object> list = new ArrayList<String>();//不可以这样

2.<?>:支持任意泛型类型

3.<? extends A>:支持A类以及A类的子类,固定了泛型的上限

4.<? super A>:支持A类以及A类的父类,不限于直接父类,规定了泛型的下限

main()
{
    //List<?> 表示任意的泛型类型都可以接受
	public static void printCollection1(List<?> c) {
        for(Object object :c) {
			System.out.println(object)
        }
    }
    
    public static void printCollection1(List<? extends AA> c) {
        for(Object object :c) {
			System.out.println(object)
        }
    }
    
    public static void printCollection1(List<? super AA> c) {
        for(Object object :c) {
			System.out.println(object)
        }
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

8个拿来即用的Python自动化脚本!

每天你都可能会执行许多重复的任务&#xff0c;例如阅读新闻、发邮件、查看天气、清理文件夹等等&#xff0c;使用自动化脚本&#xff0c;就无需手动一次又一次地完成这些任务&#xff0c;非常方便。而在某种程度上&#xff0c;Python 就是自动化的代名词。 今天分享 8 个非常…

BGP的基本配置

l 按照以下步骤配置BGP协议&#xff1a; 第1步&#xff1a;设备基本参数配置&#xff0c;AS内配置IGP确保内部网络连通性&#xff1b; l 配置IGP&#xff08;OSPF协议等&#xff09;路由解决peer对等体的源和目标IP之间连通性&#xff0c;确保peer之间TCP&#xff08;179&a…

如何查看自己的公网IP?

我们在网络中&#xff0c;每一个设备都被分配了一个唯一的IP地址&#xff0c;用以区分和识别其他设备。公网IP地址是指可被公众访问的IP&#xff0c;是因特网上的全球唯一标识。当我们需要查看自己的公网IP时&#xff0c;可以采取以下几种方式。 使用命令行查看公网IP 在Windo…

SpringCloud 之 服务提供者

前提 便于理解,我修改了本地域名》这里!!! 127.0.0.1 eureka7001.com 127.0.0.1 eureka7002.com 127.0.0.1 eureka7003.com学习Rest实例之提供者 提供者模块展示 1、导入依赖 <!-- 实体类 Web--><dependency><groupId>com.jyl</groupId><…

光电离子传感器PID-AH5在空气质量监测和HVAC系统中的应用

随着工业化和城市化的步伐不断加快&#xff0c;空气质量问题日益严重&#xff0c;对人们的健康和生活品质构成了严重威胁。为了有效监测和改善空气质量&#xff0c;光电离子传感器作为一种先进的检测技术&#xff0c;正在空气质量监测以及HVAC&#xff08;供暖、通风和空调&…

OpenHarmony实战开发-状态变量组件定位工具实践

概述 自定义组件中的变量被状态装饰器&#xff08;State&#xff0c;Prop等&#xff09;装饰后成为状态变量&#xff0c;而状态变量的改变会引起使用该变量的UI组件渲染刷新。状态变量的不合理使用可能会带来冗余刷新等性能问题。开发者可以使用状态变量组件定位工具获取状态管…

JdbcTemplate详解

1 概述 为了使JDBC更加易于使用&#xff0c;Spring在JDBC API上定义了一个抽象层&#xff0c;以此建立一个JDBC存取框架。 作为Spring JDBC框架的核心&#xff0c;JDBC模板的设计目的是为不同类型的JDBC操作提供模板方法&#xff0c;通过这种方式&#xff0c;可以在尽可能保留…

【数据结构(邓俊辉)学习笔记】向量02——动态空间管理

文章目录 1. 概述2. 静态空间管理缺点3. 动态空间管理3.1 扩容3.1.1 如何实现扩容3.1.2 扩容算法3.1.3 容量递增策略 VS 容量倍增策略3.1.3.1 容量倍增策略分摊分析3.1.3.2 容量递增策略分摊分析3.1.3.3 结果对比 3.2缩容3.2.1 动态缩容算法实现3.2.2 动态缩容算法时间复杂度 4…

Sui主网升级至V1.23.1版本

其他升级要点如下所示&#xff1a; #17126 协议&#xff1a;Deepbook的更改将被还原。 #16673 开发者可能会看到更多编译器诊断&#xff0c;因为选择的解析错误不再阻止编译&#xff0c;并且编译器的诊断会到达后续编译阶段&#xff0c;其中可能会生成额外的诊断。 #16966…

SQLite FTS5 扩展(三十)

返回&#xff1a;SQLite—系列文章目录 上一篇:SQLite的知名用户(二十九) 下一篇:SQLite 的命令行 Shell(三十一&#xff09; 1. FTS5概述 FTS5 是一个 SQLite 虚拟表模块&#xff0c;它为数据库应用程序提供全文搜索功能。在最基本的形式中&#xff0c; 全文搜索引擎允许…

【LAMMPS学习】八、基础知识(4.5)TIP5P水模型

8. 基础知识 此部分描述了如何使用 LAMMPS 为用户和开发人员执行各种任务。术语表页面还列出了 MD 术语&#xff0c;以及相应 LAMMPS 手册页的链接。 LAMMPS 源代码分发的 examples 目录中包含的示例输入脚本以及示例脚本页面上突出显示的示例输入脚本还展示了如何设置和运行各…

JVS物联网平台驱动网关管理:智能化与自动化的探索

驱动网关的管理 驱动网关是对驱动进程进行生命周期的管理&#xff0c;包括驱动进程的创建、启停、更新、结束等管理功能。 如下图所示&#xff1a; 驱动代理程序是驱动网关的管理程序&#xff0c;每个驱动网关对应于一个驱动代理程序&#xff0c;驱动代理程序初始版本是安装在…

Nginx解决跨域访问难题:轻松实现跨域资源共享!

点击下方关注我&#xff0c;然后右上角点击...“设为星标”&#xff0c;就能第一时间收到更新推送啦~~~ 跨域资源共享&#xff08;CORS&#xff0c;Cross-Origin Resource Sharing&#xff09;是一种网络浏览器的安全功能&#xff0c;它限制了一个源&#xff08;域、协议和端口…

算法----BF算法KMP算法

请想象一个情景&#xff1a; 当你脑海中突然浮现出一个词&#xff0c;你该怎么去找到这个词的有关内容&#xff1f; 打开我们浏览器的搜索框&#xff0c;输入你想的这个词&#xff0c;然后点击Enter。浏览器就会自动搜索与该词匹配的内容。 这个过程实际上可以简化成以下形式…

常用的时间序列分析方法总结和代码示例

时间序列是最流行的数据类型之一。视频&#xff0c;图像&#xff0c;像素&#xff0c;信号&#xff0c;任何有时间成分的东西都可以转化为时间序列。 在本文中将在分析时间序列时使用的常见的处理方法。这些方法可以帮助你获得有关数据本身的见解&#xff0c;为建模做好准备并…

删除docker的容器与镜像

如果您想要卸载通过 docker pull influxdb 命令下载的 InfluxDB 容器&#xff0c;您需要执行以下步骤&#xff1a; 1. **停止正在运行的 InfluxDB 容器**&#xff1a; 首先&#xff0c;您需要停止任何正在运行的 InfluxDB 容器。您可以使用以下命令来查找正在运行的 InfluxD…

15 JavaScript学习:循环

JavaScript循环语句概念和分类 JavaScript中的循环语句用于重复执行特定的代码块&#xff0c;直到指定的条件不再满足。下面是JavaScript中常用的循环语句以及它们的概念和分类&#xff1a; for 循环&#xff1a;for循环通过指定起始条件、循环条件和递增/递减步长来进行迭代。…

C++程序在Windows平台上各种定位内存泄漏的方法

一、前言 在Linux平台上有valgrind可以非常方便的帮助我们定位内存泄漏&#xff0c;因为Linux在开发领域的使用场景大多是跑服务器&#xff0c;再加上它的开源属性&#xff0c;相对而言&#xff0c;处理问题容易形成“统一”的标准。而在Windows平台&#xff0c;服务器和客户端…

云计算时代:SFP、SFP+、SFP28、QSFP+和QSFP28光纤模块详解

随着数据中心的快速发展和云计算的广泛应用&#xff0c;高速、高效率的光纤网络传输成为关键需求。在众多光纤模块中&#xff0c;SFP、SFP、SFP28、QSFP和QSFP28是最常见的几种类型。本文将为您详细解析这几种光纤模块之间的区别&#xff0c;帮助您更好地了解和选择适合自己需求…

VS2019中配置C++ OpenCV 4.5.4完整指南

⭐️我叫忆_恒心&#xff0c;一名喜欢书写博客的在读研究生&#x1f468;‍&#x1f393;。 如果觉得本文能帮到您&#xff0c;麻烦点个赞&#x1f44d;呗&#xff01; 近期会不断在专栏里进行更新讲解博客~~~ 有什么问题的小伙伴 欢迎留言提问欧&#xff0c;喜欢的小伙伴给个三…