泛型

一、泛型的引出

代码示例

public class pra {public static void main(String[] args) {ArrayList arrayList = new ArrayList();arrayList.add("java");arrayList.add("jack");arrayList.add("jom");arrayList.add(new a());for (Object obj :arrayList) {String str = (String)obj;System.out.println(str);}}
}class a{public a() {}
}

由于添加了 a 对象,但是在遍历的时候遍历的是字符串对象,这个时候就会抛出ClassCastException异常

问题总结

总结:由于集合中添加的对象,当集合中的对象不为同一类对象时,遍历集合就会出现异常,这个时候可以通过泛型来约束集合存储的对象类型


二、泛型

1. 基本介绍

(1)泛型又称参数化类型,是 Jdk5.0 出现的新特性,解决数据类型的安全性问题

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

(3)Java 泛型可以保证如果程序在编译时没有发出警告,运行时就不会产生 ClassCastException 异常。同时,代码更加简洁、健壮

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

(5)泛型的理解:是一种表示数据类型的数据类型

2. 泛型的使用

(1)基本语法

单例集合

ArrayList<T> arrylist = new ArrayList<T>()

双例集合

HashMap<K,V> arrylist = new HashMap<K,V>()

推荐写法

ArrayList<String> arrylist = new ArrayList<>()

说明:T、K、V 不代表值(可以替换成其他任意字母),而是表示类型

(2)应用场景

1. 接口

interface 接口名<T>{}

2. 类

class<K,T....>{}

注意:类中可以有多个泛型变量

3. 泛型的优点

4. 泛型的使用细节

ArrayList list = new ArrayList();ArrayList<Object> list = new ArrayList<>()

传入子类型的说明

public class pra {public static void main(String[] args) {animal<a> a = new animal<a>(new a());animal<a> b = new animal<a>(new b());}
}class a{}class b extends a{}class animal<T>{T e;// 构造器public animal(T e){this.e = e;}public void getclass(){System.out.println(e.getClass());}
}

说明:指定了animal类只能存储 a 类对象,但是 b 类是 a 的子类,即 animal 类既可以是 a 对象也可以是 b 对象

5. 简单的泛型案例

public class pra {public static void main(String[] args) {HashMap<String,student> hashMap = new HashMap<>();hashMap.put("18",new student("jackson"));hashMap.put("20",new student("jack"));hashMap.put("23",new student("jom"));// 先取出entrysetSet<Map.Entry<String, student>> entries = hashMap.entrySet();// 构建迭代器(指向单例集合)Iterator<Map.Entry<String, student>> iterator = entries.iterator();while (iterator.hasNext()) {Map.Entry<String, student> next = iterator.next();System.out.println("key:" + next.getKey() + " value:" + next.getValue());}}
}class student{String name;public student(String name) {this.name = name;}@Overridepublic String toString() {return "student{" +"name='" + name + '\'' +'}';}
}

通过指定 HashMap 存储键值对的类型,然后遍历集合查看存储结果


三、自定义泛型类

1. 基本介绍

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

(2) 使用泛型的数组,不能初始化(由于不知道数组的类型,无法在内存开辟空间)

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

(4) 泛型类的类型,是在创建对象时确定的(因为创建对象时,需要指定确定类型)

(5) 如果在创建对象时,没有指定类型,默认为 Object

(6)泛型是标识符,需要大写

结构示例

class a<T,K,V...>{T age;K name;V phone_number;...
}

四、自定义泛型接口

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

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

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

(4)如果一个类实现了泛型接口,需要实现接口中的方法并且需要指定接口方法中的泛型类型

代码示例

public class pra {public static void main(String[] args) {}
}interface a<T,R>{// 接口中的变量默认是静态的,需要赋初值void hi(T t,R r);void pay(T t,R r);void run(T t,R r);
}class b implements a<String,Double>{@Overridepublic void hi(String s, Double aDouble) {}@Overridepublic void pay(String s, Double aDouble) {}@Overridepublic void run(String s, Double aDouble) {}
}

代码分析

通过指定泛型的类型来实现接口中的方法


五、自定义泛型方法

(1)实体信息为泛型方法的定义位置相关内容,泛型方法可定义在普通类或泛型类中

(2)泛型方法调用时确定类型(通过传入的参数自动判断是什么类型)

(3)若修饰符后无 <T,R...> ,像 public void eat(E e) {} 不是泛型方法,只是方法参数使用了泛型


六、泛型的继承和通配符

(1)泛型不具备继承性(错误案例:List<Object> list = new ArrayList<String>()

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

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

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

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

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

相关文章

SpringMVC系列(一)(介绍,简单应用以及路径位置通配符)

0 引言 作者正在学习SpringMVC相关内容&#xff0c;学到了一些知识&#xff0c;希望分享给需要短时间想要了解SpringMVC的读者朋友们&#xff0c;想用通俗的语言讲述其中的知识&#xff0c;希望与诸位共勉&#xff0c;共同进步&#xff01; 1 SpringMVC介绍 SpringMVC本质上…

Java中如何使用lambda表达式分类groupby

Java中如何使用lambda表达式分类groupby Java中如何使用lambda表达式分类groupby分类问题场景传统手写方式lambda使用groupBy()方法一行结束&#xff01;&#xff01;&#xff01;完整代码 Java中如何使用lambda表达式分类groupby 分类问题场景 比如一群学生根据性别和年龄排…

无人机开发分享——无人机集群基于braft实现长机动态推选算法

在无人机集群项目的算法开发中&#xff0c;推选长机作为集群的动态中心&#xff0c;往往承担着集群管理、通讯中继等重要功能。由于通讯链路的有限性和任务的实时性需要&#xff0c;需要保证动态长机时刻工作正常&#xff0c;并在异常情况下快速切换新长机。 本文主要分享基于b…

python 解码 jwt

import base64 import jsondef base64url_decode(base64url_data):# 将URL安全的base64编码数据转换为标准的base64编码数据base64_data base64url_data.replace(-, ).replace(_, /)# 如果数据长度不是4的倍数&#xff0c;则补齐padding_length 4 - len(base64_data) % 4base…

腾讯云TCCA认证考试报名 - TDSQL数据库交付运维工程师(MySQL版)

数据库交付运维工程师-腾讯云TDSQL(MySQL版)认证 适合人群&#xff1a; 适合从事TDSQL(MySQL版)交付、初级运维、售前咨询以及TDSQL相关项目的管理人员。 认证考试 单选*40道多选*20道 成绩查询 70分及以上通过认证&#xff0c;官网个人中心->认证考试 查询 考试费用&am…

Spring Boot的Security安全控制——认识SpringSecurity!

Spring Boot的Security安全控制 在Web项目开发中&#xff0c;安全控制是非常重要的&#xff0c;不同的人配置不同的权限&#xff0c;这样的系统才安全。最常见的权限框架有Shiro和Spring Security。Shiro偏向于权限控制&#xff0c;而Spring Security能实现权限控制和安全控制…

深入理解ArrayList:从Java原生实现到手写一个ArrayList

Java原生ArrayList解析 基本结构 Java的ArrayList是基于数组实现的动态列表&#xff0c;主要特点包括&#xff1a; 动态扩容&#xff1a;当元素数量超过当前容量时&#xff0c;自动扩容&#xff08;通常增加50%&#xff09; 快速随机访问&#xff1a;通过索引访问元素的时间…

【力扣 简单 C】206. 反转链表

目录 题目 解法一&#xff1a;迭代 解法二&#xff1a;递归 题目 解法一&#xff1a;迭代 struct ListNode* reverse(struct ListNode* head) {struct ListNode* retHead NULL;while (head){struct ListNode* nextNode head->next;head->next retHead;retHead he…

明代大模型:智能重构下的文明再发现

引言&#xff1a;当紫禁城遇见生成式AI 一幅动态的《紫禁城图卷》正通过全息投影技术演绎永乐年间的宫廷盛景。这个虚实交融的场景&#xff0c;恰似明代大模型技术的隐喻——以人工智能为纽带&#xff0c;连接起永乐盛世的恢弘气象与数字时代的文明重构。作为人工智能与历史学…

推荐使用的Unity插件(行为树Behavior )

在 Unity 6.0 中使用 Behavior Designer 行为树插件开发 AI 系统&#xff0c;需结合其核心节点设计、变量管理和代码控制。以下是详细指南&#xff0c;整合了最新版本的最佳实践&#xff1a; &#x1f6e0;️ 1. 安装与基础配置 安装插件 通过 Unity Asset Store 安装 “Behav…

107. Java 继承 - 总结:方法重写与隐藏

文章目录 107. Java 继承 - 总结&#xff1a;方法重写与隐藏**详细解释&#xff1a;****方法重载** **总结** 107. Java 继承 - 总结&#xff1a;方法重写与隐藏 在 Java 中&#xff0c;定义与超类中的方法具有相同签名的方法时&#xff0c;不同类型的方法之间会有不同的行为。…

Spring Cloud使用Eureka调用接口,超时设置(二)

在 Spring Cloud 微服务架构中&#xff0c;当同时配置了 Ribbon 和 Feign 的超时时间时&#xff0c;Feign 的配置优先级高于 Ribbon。具体规则和底层逻辑如下&#xff1a; ⚙️ 1. 配置优先级规则 Feign 显式配置 > Ribbon 配置 若在 Feign 中显式设置了超时时间&#xff0…

iOS-SM3加密算法N种集成

近期的一个项目需要用到SM3加密算法&#xff0c;需要在iOS中使用Objective-C实现SM3国密加密算法。 SM3&#xff1a;是中国国家密码管理局发布的密码杂凑算法标准&#xff0c;适用于商用密码应用中的数字签名和验证、消息认证码的生成与验证以及随机数的生成等 由于iOS系统并未…

[逆向工程]什么是TEB 与 PEB(二十九)

[逆向工程]什么是TEB 与 PEB(二十九) 一、引言:为什么需要了解 TEB/PEB? 在 Windows 系统开发、调试或逆向工程中,TEB(Thread Environment Block) 和 PEB(Process Environment Block) 是理解程序执行机制的关键。它们如同进程与线程的“身份证”,存储了从内存布局到…

逆向分析贝壳网人机验证JS加密逻辑

引言 在数据爬取和自动化测试过程中&#xff0c;人机验证&#xff08;如滑块、点选、短信验证等&#xff09;是常见的反爬手段。贝壳网&#xff08;ke.com&#xff09;作为国内领先的房产平台&#xff0c;其人机验证机制较为复杂&#xff0c;涉及前端JS加密、动态Token、行为检…

Vue3 + Element Plus中el-table加载状态分析

在 Vue 3 中&#xff0c;当 onMounted 钩子被触发时&#xff0c;父组件的 DOM 已经挂载完成&#xff0c;但子组件&#xff08;如 el-table&#xff09;可能尚未完成其内部渲染。具体分析如下&#xff1a; 1. onMounted 的执行时机 父组件挂载完成&#xff1a;onMounted 表示当前…

OpenCV图像拼接技术详解:从特征匹配到全景合成

本文将详细介绍如何使用OpenCV实现两幅图像的自动拼接&#xff0c;涵盖特征提取、单应性矩阵计算和图像融合等关键技术。 一、图像拼接概述 图像拼接是将多张有重叠区域的图像合并成一幅全景图的技术&#xff0c;广泛应用于全景摄影、卫星图像处理、医学影像等领域。其核心技术…

如何通过 5 种方式向 Android 手机添加音乐

想把音乐添加到你的安卓手机&#xff0c;然后随时随地无需网络连接就能欣赏你喜爱的音乐吗&#xff1f;这不再是麻烦。现在&#xff0c;你可以按照本指南中的有效方法&#xff0c;将音乐添加到你的安卓手机上。让我们在安卓手机上聆听我们美妙的歌曲吧。 第 1 部分&#xff1a;…

VS Code 项目中的 .vscode 目录详解

VS Code 项目中的 .vscode 目录详解 .vscode 目录是 VS Code 项目的核心配置中心&#xff0c;它包含特定于当前项目的配置&#xff0c;这些配置覆盖全局设置&#xff0c;确保团队成员获得一致的开发环境体验。 .vscode 目录中的核心文件 文件名作用是否应纳入版本控制settin…

Ubuntu22.04安装opengauss并配置远程访问、JDBC连接

内容概括 最近在研究怎么在ubuntu服务器环境下使用opengauss&#xff0c;看了下官方下载地址没有适配ubuntu的安装包。仔细翻了下官方文档&#xff0c;发现安装指南里有提供一个deb包安装方案&#xff0c;有适配ubuntu&#xff0c;经过实践可行&#xff0c;于是记录下来给有需要…