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

Java泛型:类型安全的艺术

Java泛型是JDK 5中引入的一项重要特性,它为Java带来了类型安全的机制,极大地提升了代码的可读性和可维护性。泛型允许程序员在编译时检测非法类型,从而避免了运行时的ClassCastException异常,使得代码更加健壮和可靠。

泛型的基本概念

泛型,即“参数化类型”,允许我们在定义类、接口和方法时,指定一个或多个类型参数。这些类型参数在实例化时会被具体的类型所替代,从而实现代码的复用和类型安全。

例如,一个简单的泛型类定义如下:

public class Generic<T> {private T key;public Generic(T key) {this.key = key;}public T getKey() {return key;}
}

在这个例子中,T 是一个类型参数,代表任意类型。在实例化 Generic 类时,我们需要指定 T 的具体类型:

Generic<Integer> intGeneric = new Generic<Integer>(123);
Generic<String> strGeneric = new Generic<String>("Hello");

泛型的使用方式

Java泛型主要有三种使用方式:

  • 泛型类:如上文中的 Generic,在类定义中使用类型参数。
  • 泛型接口:接口也可以使用类型参数,例如:
public interface Generator<T> {public T method();
}
  • 泛型方法:在方法签名中使用类型参数,例如:
public class GenericMethods {public <T> void f(T x) {System.out.println(x.getClass().getName());}
}

泛型的底层实现机制

Java泛型的底层实现依赖于一种称为“泛型擦除”的机制。在编译阶段,泛型类型信息会被擦除,只保留原始类型。例如,ArrayList 和 ArrayList 在编译后的字节码中都是 ArrayList。这种擦除机制保证了Java泛型与早期版本的兼容性。

泛型擦除的具体过程包括:

  • 用 Object 或者边界类型替代泛型类型参数。
  • 在适当的位置插入强制类型转换代码,以确保类型安全。
  • 在继承泛型类或接口的类中自动生成桥接方法,以保留多态性。

泛型的边界和通配符

为了更灵活地使用泛型,Java提供了通配符和边界概念:
无界通配符 <?>:表示任意类型,常用于只接收而不处理的情况。
上界通配符 <? extends T>:表示类型 T 或其子类,用于读取操作。
下界通配符 <? super T>:表示类型 T 或其父类,用于写入操作。

泛型擦除的限制

泛型擦除机制带来了一些限制:

  • 不支持基本数据类型:泛型只能用于引用类型,不能使用基本类型(如 int、double 等),但可以通过自动装箱机制使用其对应的包装类。
  • 无法创建具体类型的泛型数组:例如,List[] l1 = new ArrayList; 是非法的。
  • 反射可以绕过泛型限制:由于泛型信息在运行时被擦除,通过反射可以绕过编译器的类型检查,但这通常不推荐,因为会破坏类型安全。

总结

Java泛型通过类型参数化提供了编译时的类型安全检测,极大地提升了代码的健壮性和可维护性。尽管泛型擦除机制带来了一些限制和复杂性,但总体上,泛型使得Java代码更加优雅和安全。在实际开发中,合理使用泛型可以显著提高代码的质量和可读性。

全文完!

相关文章:

Java泛型:类型安全的艺术

Java泛型是JDK 5中引入的一项重要特性&#xff0c;它为Java带来了类型安全的机制&#xff0c;极大地提升了代码的可读性和可维护性。泛型允许程序员在编译时检测非法类型&#xff0c;从而避免了运行时的ClassCastException异常&#xff0c;使得代码更加健壮和可靠。 泛型的基本…...

Redis 淘汰策略 问题

前言 相关系列 《Redis & 目录》&#xff08;持续更新&#xff09;《Redis & 淘汰策略 & 源码》&#xff08;学习过程/多有漏误/仅作参考/不再更新&#xff09;《Redis & 淘汰策略 & 总结》&#xff08;学习总结/最新最准/持续更新&#xff09;《Redis &a…...

技术成神之路:设计模式(二十二)命令模式

相关文章&#xff1a;技术成神之路&#xff1a;二十三种设计模式(导航页) 介绍 命令模式&#xff08;Command Pattern&#xff09;是一种行为设计模式&#xff0c;允许将请求&#xff08;命令&#xff09;封装为对象&#xff0c;从而使您可以使用不同的请求、队列或记录请求日…...

facebook账号类型有哪些?

Facebook的主要账号类型 在Facebook上&#xff0c;用户可以基于不同的目的和需求创建不同类型的账号&#xff0c;主要包括以下几类&#xff1a; 1. 个人账号 这是最常见的Facebook账号类型&#xff0c;每个用户都可以创建一个个人账号&#xff0c;分享生活动态、与朋友互动、…...

Flutter鸿蒙next 中如何实现 WebView【跳、显、适、反】等一些基础问题

✅近期推荐&#xff1a;求职神器 https://bbs.csdn.net/topics/619384540 &#x1f525;欢迎大家订阅系列专栏&#xff1a;flutter_鸿蒙next &#x1f4ac;淼学派语录&#xff1a;只有不断的否认自己和肯定自己&#xff0c;才能走出弯曲不平的泥泞路&#xff0c;因为平坦的大路…...

机器视觉:9点标定的原理与实现

一、什么是标定 标定就是将机器视觉处理得到的像素坐标转换成实际项目中使用到的毫米坐标。简单说即使看看实际单位距离内有几个像素&#xff0c;如下图所示&#xff0c;10mm的距离内有222个像素&#xff0c;那像素坐标和实际的毫米坐标就有个比例关系了。 二、九点标定 9点标…...

《深度学习》 了解YOLO基本知识

目录 一、关于YOLO 1、什么是YOLO 2、经典的检测方法 1&#xff09;one-stage单阶段检测 模型指标介绍&#xff1a; 2&#xff09;two-stage多阶段检测 二、关于mAP指标 1、概念 2、IOU 3、关于召回率和准确率 4、示例 5、计算mAP 一、关于YOLO 1、什么是YOLO YOL…...

什么是Kubernetes?K8s基础与工作原理

什么是 Kubernetes&#xff08;K8s&#xff09;&#xff1f; Kubernetes&#xff0c;通常简称为 K8s&#xff0c;是一个用于自动化部署、扩展和管理容器化应用程序的开源容器编排平台。它由 Google 于 2014 年开源&#xff0c;后来交由 CNCF&#xff08;Cloud Native Computin…...

HTML5新增属性

1、HTML5 1.1 新增布局标签 header&#xff1a;用于定义文档或者section的页眉&#xff1b;footer&#xff1a;用于定义页面或section的底部信息&#xff1b;nav&#xff1a;用于定位页面上的导航链接部分&#xff1b;article&#xff1a;用于定位文档或者页面中的独立部分&a…...

软件开发术语(E开头)---持续更新

e—business 电子商务EAI (enterprise application integration)企业应用程序集成(整合)EBCO (empty base class optimization) 空基类优化(机制)Edge and Vertex Connectivity 割边/割点 Edge Coloring 边染色 EDI (Dlectronic Data Interchange)电子数据交换effic…...

多机器人编队避障算法(1)

文章目录 前言一、基于感知的避障1.基于感知的Epuck2避障思路(理论)2.基于感知的Epuck2避障实现(现实)3.距离传感器结合红外传感器修复避障Bug4.问题5.代码逻辑图 二、基于人工势场力的避障1.基于人工势场的Epuck2避障思路(理论)2.基于人工势场力的Epuck2避障实现(现实) 三、两…...

【网站项目】SpringBoot401超市收银系统

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…...

KD树详解:多维数据高效搜索的利器

摘要 在处理多维数据时&#xff0c;如何高效地进行搜索与查询成为一个关键问题。KD树&#xff08;K-Dimensional Tree&#xff09;作为一种高效的多维数据结构&#xff0c;广泛应用于计算机视觉、机器人导航、数据库检索等领域。本文将详细介绍KD树的基本概念、结构、构建算法…...

从裸机到70B大模型2:基础设施设置与脚本

从裸机到70B大模型2&#xff1a;基础设施设置与脚本 随着深度学习技术的不断发展&#xff0c;神经网络模型的规模逐渐扩大&#xff0c;从单个模型到大型70B模型&#xff0c;所需的计算资源和存储空间也在不断增加。为了训练这些大型模型&#xff0c;我们需要一套高效的基础设施…...

shodan4,挂黑网站查找,弱口令网站搜索

myip参数 shodan myip&#xff08;查看自己的出口IP,哪个地址链接的公网)挂黑网站查找 我们今天看一看找一下&#xff0c;有些已经被黑的网站好吧&#xff0c;就是利用shodan查看一下哪些网站已经被黑了。 shodan search -limit 10 -fields ip_str,port http.title:hacked b…...

spring boot 整合Knife4j

项目依赖配置 在本项目中,我们使用了以下关键依赖,以支持 Spring Boot 和 API 文档生成。 1. Spring Boot 版本 为了构建一个可靠和高效的 Spring Boot 应用程序,我们使用以下父级依赖: <parent><groupId>org.springframework.boot</groupId><art…...

攻防世界的新手web题解

攻防世界引导模式 1、disabled_button 好&#xff0c;给了一个按钮&#xff0c;第一道题目就不会做 看的wp<input disabled class"btn btn-default" style"height:50px;width:200px;" type"submit" value"flag" name"auth&q…...

【国潮来袭】华为原生鸿蒙 HarmonyOS NEXT(5.0)正式发布:鸿蒙诞生以来最大升级,碰一碰、小艺圈选重磅上线

在昨日晚间的原生鸿蒙之夜暨华为全场景新品发布会上&#xff0c;华为原生鸿蒙 HarmonyOS NEXT&#xff08;5.0&#xff09;正式发布。 华为官方透露&#xff0c;截至目前&#xff0c;鸿蒙操作系统在中国市场份额占据 Top2 的领先地位&#xff0c;拥有超过 1.1 亿 的代码行和 6…...

pytest 单元框架里,前置条件

1.使用 setup 函数级的&#xff08;setup_function、teardown_function&#xff09;只对函数用例生效&#xff0c;而且不在类中使用类级的&#xff08;setup_class、teardown_class&#xff09;在类中使用&#xff0c;类执行之前运行一次&#xff0c;类执行之后运行一次 类中方…...

数字IC后端实现 | Innovus各个阶段常用命令汇总

应各位读者要求&#xff0c;小编最近按照Innovus流程顺序整理出数字IC后端项目中常用的命令汇总。限于篇幅&#xff0c;这次只更新到powerplan阶段。有了这份Innovus常用命令汇总&#xff0c;学习数字IC后端从此不再迷路&#xff01;如果大家觉得这个专题还不错&#xff0c;想继…...

Chapter03-Authentication vulnerabilities

文章目录 1. 身份验证简介1.1 What is authentication1.2 difference between authentication and authorization1.3 身份验证机制失效的原因1.4 身份验证机制失效的影响 2. 基于登录功能的漏洞2.1 密码爆破2.2 用户名枚举2.3 有缺陷的暴力破解防护2.3.1 如果用户登录尝试失败次…...

SkyWalking 10.2.0 SWCK 配置过程

SkyWalking 10.2.0 & SWCK 配置过程 skywalking oap-server & ui 使用Docker安装在K8S集群以外&#xff0c;K8S集群中的微服务使用initContainer按命名空间将skywalking-java-agent注入到业务容器中。 SWCK有整套的解决方案&#xff0c;全安装在K8S群集中。 具体可参…...

Linux 文件类型,目录与路径,文件与目录管理

文件类型 后面的字符表示文件类型标志 普通文件&#xff1a;-&#xff08;纯文本文件&#xff0c;二进制文件&#xff0c;数据格式文件&#xff09; 如文本文件、图片、程序文件等。 目录文件&#xff1a;d&#xff08;directory&#xff09; 用来存放其他文件或子目录。 设备…...

pam_env.so模块配置解析

在PAM&#xff08;Pluggable Authentication Modules&#xff09;配置中&#xff0c; /etc/pam.d/su 文件相关配置含义如下&#xff1a; 配置解析 auth required pam_env.so1. 字段分解 字段值说明模块类型auth认证类模块&#xff0c;负责验证用户身份&am…...

五年级数学知识边界总结思考-下册

目录 一、背景二、过程1.观察物体小学五年级下册“观察物体”知识点详解&#xff1a;由来、作用与意义**一、知识点核心内容****二、知识点的由来&#xff1a;从生活实践到数学抽象****三、知识的作用&#xff1a;解决实际问题的工具****四、学习的意义&#xff1a;培养核心素养…...

[Java恶补day16] 238.除自身以外数组的乘积

给你一个整数数组 nums&#xff0c;返回 数组 answer &#xff0c;其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法&#xff0c;且在 O(n) 时间复杂度…...

【论文阅读28】-CNN-BiLSTM-Attention-(2024)

本文把滑坡位移序列拆开、筛优质因子&#xff0c;再用 CNN-BiLSTM-Attention 来动态预测每个子序列&#xff0c;最后重构出总位移&#xff0c;预测效果超越传统模型。 文章目录 1 引言2 方法2.1 位移时间序列加性模型2.2 变分模态分解 (VMD) 具体步骤2.3.1 样本熵&#xff08;S…...

html-<abbr> 缩写或首字母缩略词

定义与作用 <abbr> 标签用于表示缩写或首字母缩略词&#xff0c;它可以帮助用户更好地理解缩写的含义&#xff0c;尤其是对于那些不熟悉该缩写的用户。 title 属性的内容提供了缩写的详细说明。当用户将鼠标悬停在缩写上时&#xff0c;会显示一个提示框。 示例&#x…...

【电力电子】基于STM32F103C8T6单片机双极性SPWM逆变(硬件篇)

本项目是基于 STM32F103C8T6 微控制器的 SPWM(正弦脉宽调制)电源模块,能够生成可调频率和幅值的正弦波交流电源输出。该项目适用于逆变器、UPS电源、变频器等应用场景。 供电电源 输入电压采集 上图为本设计的电源电路,图中 D1 为二极管, 其目的是防止正负极电源反接, …...

C++课设:简易日历程序(支持传统节假日 + 二十四节气 + 个人纪念日管理)

名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 专栏介绍:《编程项目实战》 目录 一、为什么要开发一个日历程序?1. 深入理解时间算法2. 练习面向对象设计3. 学习数据结构应用二、核心算法深度解析…...