当前位置: 首页 > 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;想继…...

MySQL全文索引检索中文

MySQL全文索引检索中文 5.7.6版本不支持中文检索&#xff0c;需要手动修改配置 ft_min_word_len 1 &#xff0c;因为默认配置 4 SHOW VARIABLES LIKE ft%; show VARIABLES like ngram_token_size;配置 修改 MySQL 配置文件 vim /etc/my.cnf在配置的 [mysqld] 下面添加**ft_…...

pikachu靶场-Cross-Site Scripting(XSS)

sqli-labs靶场安装以及刷题记录-dockerpikachu靶场-Cross-Site Scripting pikachu靶场的安装刷题记录反射型xss(get)反射型xss(post)存储型xssDOM型xssDOM型xss-xxss盲打xss之过滤xss之htmlspecialcharsxss之href输出xss之js输出 pikachu靶场的安装 刷题记录 反射型xss(get) …...

在数据库访问中,使用localhost、127.0.0.1和IP地址有什么差异

在数据库访问中&#xff0c;使用127.0.0.1和IP地址&#xff08;在本地环境中通常指的是局域网IP或环回地址&#xff09;的速度差异&#xff0c;实际上是非常微小的&#xff0c;甚至在很多情况下可以忽略不计。不过&#xff0c;为了更深入地理解这个问题&#xff0c;我们可以从以…...

C语言 | Leetcode C语言题解之第513题找树左下角的值

题目&#xff1a; 题解&#xff1a; #define MAX_NODE_SIZE 10000int findBottomLeftValue(struct TreeNode* root){int ret;struct TreeNode** queue (struct TreeNode **)malloc(sizeof(struct TreeNode) * MAX_NODE_SIZE);int head 0;int tail 0;queue[tail] root;whil…...

人工智能:改变未来生活与工作的无尽可能

随着科技的飞速发展&#xff0c;人工智能&#xff08;AI&#xff09;正成为推动全球变革的重要力量。无论是在医疗、企业&#xff0c;还是日常生活中&#xff0c;AI技术通过赋能各行业&#xff0c;正在深刻地改变我们的生活和工作方式。这些变化为我们提供了便捷与效率的同时&a…...

讲一讲 kafka 的 ack 的三种机制?

大家好&#xff0c;我是锋哥。今天分享关于【K讲一讲 kafka 的 ack 的三种机制&#xff1f;】面试题&#xff1f;希望对大家有帮助&#xff1b; 讲一讲 kafka 的 ack 的三种机制&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 Kafka的消息确认机制&…...

若依框架部署到服务器后头像资源访问404

排错过程 第一开始以为是代理出问题了 官网给出的解决方案 第一种是用代理后端接口&#xff0c;第二种是重写路径直接访问静态文件 接口通过捕获profile开头的路径/profile/avatar…&#xff0c;转为/home…/avatar找到我们在该路径下的文件 但是我想了一下&#xff0c;我ngin…...

纯GO语言开发RTSP流媒体服务器-RTSP推流直播、本地保存录像、录像回放、http-flv及hls协议分发

温馨提示&#xff1a;我们分享的文章是给需要的人&#xff0c;不需要的人请绕过&#xff0c;文明浏览&#xff0c;误恶语伤人&#xff01; 前言 在软件开发中遇到使用流媒体音视频的行业比较多&#xff0c;如安防监控系统、无人机巡逻视频上云处理、直播平台、教育与企业培训…...

el-table相关的功能实现

1. 表格嵌套表格时&#xff0c;隐藏父表格的全选框 场景&#xff1a;当table表格设置复选&#xff08;多选&#xff09;功能时&#xff0c;如何隐藏表头的复选框&#xff0c;不让用户一键多选。 <el-table :header-cell-class-name"cellClass">// 表头复选框禁…...

衡石分析平台系统分析人员手册-展示类控件创建富文本攻略

富文本​ 富文本控件是一种常见的控件&#xff0c;可用来展示文本信息、用户属性信息&#xff0c;在数据分析中起到辅助分析的功能。 富文本常见的使用场景有&#xff1a; 仅展示纯文本信息。在富文本中展示数据集字段、指标、参数等信息。使用富文本展示用户属性相关信息。在…...

乡镇网站建设方案/百度竞价客服

锁是在处理并发访问数据时&#xff0c;用于定义访问规则的数据结构。MySQL 中的锁根据作用范围分类有全局锁&#xff0c;表级锁和行锁。 全局锁 当你需要对数据库进行整库备份时&#xff0c;为了保证备份时刻的所有数据一致性&#xff0c;需要确保数据库在备份期间不进行数据…...

eclipse做购物网站/福州seo技术培训

对于刚开始学QT的同学&#xff0c;在网上搜索许久之后会发现&#xff1a;一个简 单的 Qt 程序下面这个小程序&#xff0c;估计大家会感到比较亲切。似乎有相当多的中文用户尝试写过这样的代码&#xff1a;#include #include int main(int argc, char **argv){QApplication app(…...

西安给公司做网站/站长seo软件

文章目录1. AspectJ1.1 什么是AspectJ1.2 基于AspectJ实现AOP操作2. Spring实现AOP2.1 基于注解2.1.1 完全注解开发2.2 基于配置文件1. AspectJ Spirng框架一般都是基于AspectJ实现AOP操作 1.1 什么是AspectJ AspectJ不是Spring组成部分&#xff0c;独立于AOP框架&#xff0…...

廊坊网站快速排名优化/郑州网站设计

互联互通社区专注于IT互联网交流与学习&#xff0c;旨在打造最具价值的IT互联网智库中心。为丰富互联互通社区社区内容&#xff0c;给广大的关注者更丰富、更精彩、更时尚的阅读体验&#xff0c;互联互通社区视频号现已上线。互联互通社区-视频号&#xff0c;网罗IT互联网圈内的…...

建一个b2c网站要多少钱/百度怎么推广自己的店铺

环境 ubuntu16.04 Opencv3.4.5 Qt5.7.1 简述 在 ubuntu 中 做有关 opencv 的项目时&#xff0c;害怕搭建环境&#xff0c;因为搭建环境会花去很多时间和精力&#xff0c;这里自己总结了一种可以省去一些配置环境的时间和精力。 前提是第一次将 opencv 编译好&#xff0c;以…...

wap门户网站/网上企业推广

文章目录第三方驱动 黑盒移植驱动编译进内核Makefile选择驱动存放目录 (或任意目录&#xff09;改Makefile让驱动编译进内核&#xff08;同步修改&#xff0c;对应目录下的Makefile&#xff09;改Kconfig &#xff08;界面可配置&#xff09;测试驱动创建设备文件图形化配置Kco…...