Java核心技术【二十】Java泛型的基本概念和原理详解

Java泛型的基本概念和原理详解

一、泛型的基本概念

Java泛型(Generics)是Java SE 1.5(JDK 5)引入的一个新特性,它提供了一种在编译时期进行类型检查的方式,允许程序员在定义类、接口和方法时指定类型参数(Type Parameters)。这些类型参数在实例化类、实现接口或调用方法时会被具体的类型所替换,从而使得代码更加灵活、安全且易于维护。

泛型的本质是将类型参数化,即把数据类型作为一种参数传递给类或方法。这样,同一个类或方法就可以操作多种数据类型,而无需为每种数据类型编写专门的代码。

二、泛型的原理与机制

1. 泛型擦除(Type Erasure)

Java的泛型实现采用了类型擦除机制。这意味着在编译阶段,Java编译器会将泛型代码中的类型参数替换为它们的限定类型(如果没有明确限定,则默认为Object类型),并插入必要的类型转换代码。因此,在运行时,JVM中并没有泛型类型的信息,所有的泛型类型都被擦除为它们的原始类型。泛型只提供编译时类型检查,而不是运行时类型检查。

示例:

List<String> stringList = new ArrayList<>();  
stringList.add("Hello");  
  • 编译时,List<String> 被擦除为List,但编译器会确保你添加的是String类型。
  • 运行时,stringList实际上是一个原始类型的ArrayList,其中的元素被当作Object处理

2. 编译时类型检查

泛型的主要优势之一是在编译时提供类型安全检查。当使用泛型时,编译器会根据泛型参数的类型来检查代码中的类型错误。如果尝试将错误类型的对象添加到泛型集合中,或者从泛型集合中取出对象时进行了错误的类型转换,编译器会在编译时捕获这些错误,而不是等到运行时才抛出ClassCastException

示例:

List<Integer> intList = new ArrayList<>();  
intList.add("Hello"); 
  • 编译错误:不兼容的类型: String无法转换为Integer

3. 类型参数命名约定

在定义泛型类、接口或方法时,类型参数通常使用单个大写字母来命名,如T(代表Type)、E(代表Element)、K(代表Key)、V(代表Value)等。这些字母是任意的,但遵循一定的命名约定可以提高代码的可读性。

三、泛型的使用

1. 泛型类

泛型类是在类定义时声明一个或多个类型参数的类。这些类型参数在类的成员变量、方法参数、方法返回值等位置可以使用。

1)定义泛型类示例:

public class Box<T> {  private T t;public void set(T t) {this.t = t;}public T get() {return t;}
}  

2)调用泛型类示例:

public class Test {public static void main(String[] args) {// 使用示例  Box<Integer> integerBox = new Box<>();  integerBox.set(123);  //这里如果设置字符串会报错Integer value = integerBox.get();System.out.println("value:" + value);}}

2. 泛型方法

泛型方法是在方法定义时声明一个或多个类型参数的方法。这些类型参数只在该方法的作用域内有效。

1)在Box.java中添加泛型方法:

public static <T> void printArray(T[] inputArray) {  for (T element : inputArray) {  System.out.printf("%s ", element);  }  System.out.println();  
}  

2)调用示例:

// 使用示例 2 
Integer[] intArray = {1, 2, 3};  
Box.printArray(intArray);

3. 泛型接口

泛型接口与泛型类类似,也是在接口定义时声明一个或多个类型参数。实现泛型接口的类必须在实现接口时指定具体的类型参数,或者使用类型通配符来保持接口的灵活性。

示例:

public interface Pair<K, V> {public K getKey();  public V getValue();
}
public class StringIntPair implements Pair<String, Integer> {private String key;  private Integer value;  public StringIntPair(String key, Integer value) {  this.key = key;  this.value = value;  }  @Overridepublic String getKey() {return key;}@Overridepublic Integer getValue() {return value;}}

四、泛型的好处

  • 类型安全:泛型提供了编译时的类型检查,有助于减少运行时类型转换错误。
  • 消除强制类型转换:使用泛型后,大多数情况下不需要进行强制类型转换,代码更加简洁。
  • 提高代码复用性:通过泛型,可以编写更加通用的代码,适用于多种数据类型。
  • 提高代码可读性:泛型使得代码更加清晰易懂,尤其是当处理复杂的数据结构时。

综上所述,Java泛型是一种强大的特性,它通过类型擦除和编译时类型检查机制,提高了代码的安全性、复用性和可读性。掌握泛型的使用对于编写高质量的Java代码至关重要。

结束语

泛型是现代编程语言中一项极为重要的特性,它提供了编译时的类型安全检查,同时保持了代码的灵活性和复用性。理解泛型的基本概念、泛型类和泛型方法的使用,以及泛型擦除带来的类型安全问题,对于编写高质量、可维护的代码至关重要。通过合理利用泛型,开发者可以有效减少运行时错误,提升代码的整体质量。

简单动作,深刻联结。在这技术海洋,我备好舟,等你扬帆。启航吧!
🌟点击【关注】,解锁定期的技术惊喜,让灵感与知识的源泉不断涌动。
👍一个【点赞】,如同心照不宣的默契,是我们共同语言的闪亮印记。
📚【收藏】好文,搭建你的专属智慧库,让每次回望都能照亮新知之路。
源码地址:https://gitee.com/code-in-java/csdn-blog.git

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

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

相关文章

【第25章】MyBatis-Plus之字段类型处理器

文章目录 前言一、JSON 字段类型处理器1. 配置2. XML 配置对应写法3. Wrapper 查询中的 TypeHandler 使用 二、自定义类型处理器1. 创建自定义类型处理器2. 使用自定义类型处理器 三、实战1. 实体类2. 测试类3. 测试结果 总结 前言 在 MyBatis 中&#xff0c;类型处理器&#…

QImage 的图片可以直接显示吗

QImage 对象本身并不直接显示在屏幕上&#xff0c;但你可以很容易地将它转换为 QPixmap&#xff0c;然后使用 QLabel 或其他支持 pixmap 的 Qt 控件来显示它。QPixmap 是为屏幕显示而优化的图像表示&#xff0c;而 QImage 则提供了更多的图像处理能力&#xff0c;如像素访问、转…

Java PKI Programmer‘s Guide

一、PKI程序员指南概述 PKI Programmer’s Guide Overview Java认证路径API由一系列类和接口组成&#xff0c;用于创建、构建和验证认证路径。这些路径也被称作认证链。实现可以通过基于提供者的接口插入。 这个API基于密码服务提供者架构&#xff0c;这在《Java密码架构参考指…

硬件:CPU和GPU

一、CPU与GPU 二、提升CPU利用率&#xff1a;计组学过的 1、超线程一般是给不一样的任务的计算使用&#xff0c;而非在计算密集型工作中 2、Cpu一次可以计算一个线程&#xff0c;而gpu有多少个绿点一次就能计算多少个线程&#xff0c;Gpu比cpu快是因为gpu它的核多&#xff0c;…

LCD EMC 辐射 测试随想

最近做几个产品过认证。 有带2.8寸 MCU8080接口的小屏&#xff08;320 X 240&#xff09;&#xff0c;也有RGB接口的10.1寸的大屏(800*600). 以下为个人随想&#xff0c;不知道是否正确&#xff0c;仅作记录。 测试发现辐射的核心问题还是在于时钟及其倍频所产生的尖峰。 记得读…

electron src build

编译文档&#xff1a; 构建说明 | Electron 1 下载depot_tools &#xff08;1&#xff09;安装depot_tools用于获取 Chromium 及其依赖项的工具集&#xff1a;地址 WINDOWS Download the depot_tools bundle and extract it somewhere. (2)在 Windows 上&#xff0c;您需要…

【Windows】记录一次C盘爆红的经历

记录一次C盘爆红的经历 作为一个IT从业人员一个电脑爱好者&#xff0c;在拿到电脑的时候我都会先将下载、文档、桌面等内容移动到D盘&#xff08;桌面可以放在C盘&#xff09;&#xff0c;我的软件全都安装在D盘&#xff0c;然后给了C-120G/D-250G/E-100G&#xff0c;就在前两…

linux高级编程(TCP)(传输控制协议)

TCP与UDP: TCP: TCP优点&#xff1a; 可靠&#xff0c;稳定 TCP的可靠体现在TCP在传递数据之前&#xff0c;会有三次握手来建立连接&#xff0c;而且在数据传递时&#xff0c;有确认、窗口、重传、拥塞控制机制&#xff0c;在数据传完后&#xff0c;还会断开连接用来节约系统…

小试牛刀--对称矩阵压缩存储

学习贺利坚老师对称矩阵压缩存储 数据结构实践——压缩存储的对称矩阵的运算_计算压缩存储对称矩阵 a 与向量 b 的乘积-CSDN博客 本人解析博客 矩阵存储和特殊矩阵的压缩存储_n阶对称矩阵压缩-CSDN博客 版本更新日志 V1.0: 对老师代码进行模仿 , 我进行名字优化, 思路代码注释 …

【正点原子i.MX93开发板试用连载体验】AI程序的验证

本文最早发表于电子发烧友论坛&#xff1a;【新提醒】【正点原子i.MX93开发板试用连载体验】基于深度学习的语音本地控制 - 正点原子学习小组 - 电子技术论坛 - 广受欢迎的专业电子论坛! (elecfans.com) 这次的主要目标就是学习NXP的AI程序开发。首先阅读了《05【正点原子】ATK…

扩展任务1:完成页面的布局设计和美化

任务指导 1、参照下图&#xff0c;完成页面的布局和美化设计&#xff1a; 2、实现思路 例如可以通过修改Style样式的方式完成布局调整&#xff0c;具体页面显示样式&#xff0c;需要学生根据自己的喜好和设计自行完成&#xff0c;建议每个学生的页面尽量个性化设计&#xff0…

锅总反驳李彦宏说的“不要卷模型,要卷应用”

李彦宏的观点是大家不要卷模型&#xff0c;要卷应用&#xff0c;但我认为这种看法是荒谬的。以下是24条反驳李彦宏观点的论点和论据&#xff1a; 模型的准确性直接决定应用的质量和用户体验&#xff1a; 论据&#xff1a;在自然语言处理、计算机视觉等领域&#xff0c;模型的准…

【HTML入门】第六课 - 上标字、下标字和删除字

这一小节&#xff0c;我们说3个比较特殊的&#xff0c;用到的场景不多&#xff0c;但需要的时候绝对是有用处的。他们分别是上标字&#xff0c;下标字和删除字。 目录 1 上标字 2 下标字 3 删除字 4 学习HTML的一些问题 1 上标字 什么是上标字呢&#xff1f;你是否记得多少…

线程并发库复习

1.进行和线程 什么是进程&#xff1a;进程是内存分配的基本单位&#xff0c;它是程序执行时的一个实例&#xff0c;会被放到进程就绪队列&#xff0c;等进程调度器选择它&#xff0c;给它时间片&#xff0c;它才会运行。在java中启动进程&#xff0c;main&#xff0c;test&…

uniapp移动端实现商品拖拽集合,一行多个商品左滑删除功能!

许久未见&#xff0c;最近遇到一个产品&#xff0c;他是第一次做产品。总是有一些反人类的设计。没错&#xff0c;就是标题上的拖拽集合&#xff0c;以及商品的左滑删除。这种功能放眼各大app我都没找到有用这种设计的&#xff0c;他口口声声说他用过会找给我看&#xff0c;我等…

MySQL GROUP_CONCAT 函数详解与实战应用

提示&#xff1a;在需要将多个值组合成一个列表时&#xff0c;GROUP_CONCAT() 函数为 MySQL 提供了一种强大的方式来处理数据 文章目录 前言什么是 GROUP_CONCAT()基本语法 示例使用 GROUP_CONCAT()去除重复值排序结果 前言 提示&#xff1a;这里可以添加本文要记录的大概内容…

16:9横屏短视频素材库有哪些?横屏短视频素材网站分享

在这个视觉内容至关重要的时代&#xff0c;16:9横屏视频因其宽广的画面和优越的观赏体验&#xff0c;已经成为无数创作者和营销专家的首选格式。但要创造出吸引人的横屏视频&#xff0c;高质量的视频素材库是不可或缺的。不管你是资深视频制作人还是刚入行的新手&#xff0c;下…

02day-C++学习(const 指针与引用的关系 inline nullptr)

02day-C学习 1. 使用const注意事项 注意事项 • 可以引⽤⼀个const对象&#xff0c;但是必须⽤const引⽤。const引⽤也可以引⽤普通对象&#xff0c;因为对象的访 问权限在引⽤过程中可以缩⼩&#xff0c;但是不能放⼤。 • 不需要注意的是类似 int& rb a3; double d 1…

SVM - 径向基函数核 Radial Basis Function Kernel,简称RBF核或者高斯核

SVM - 径向基函数核 Radial Basis Function Kernel&#xff0c;简称RBF核或者高斯核 flyfish 径向基函数核&#xff08;Radial Basis Function Kernel&#xff0c;简称RBF核&#xff09;&#xff0c;也称为高斯核&#xff0c;是一种常用的核函数&#xff0c;用于支持向量机&a…

2025考研~数据结构试卷

作者主页&#xff1a;知孤云出岫 数据结构试题 [TOC](数据结构试题)数据结构试卷一、选择题&#xff08;每题2分&#xff0c;共20分&#xff09;二、填空题&#xff08;每题3分&#xff0c;共15分&#xff09;三、简答题&#xff08;每题10分&#xff0c;共40分&#xff09;四…