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

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

相关文章:

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

Java泛型的基本概念和原理详解 一、泛型的基本概念 Java泛型&#xff08;Generics&#xff09;是Java SE 1.5&#xff08;JDK 5&#xff09;引入的一个新特性&#xff0c;它提供了一种在编译时期进行类型检查的方式&#xff0c;允许程序员在定义类、接口和方法时指定类型参数…...

Android Studio Download Gradle 时慢问题解决

1.腾讯gradle 下载&#xff1a;后面拼接版本&#xff08;gradle-8.0-bin.zip&#xff09; https://mirrors.cloud.tencent.com/gradle/gradle-8.0-bin.zip 2.Android Studio 配置&#xff1a;setting-->gradle-->Use Gradle from 选择本地文件夹&#xff08;解压后的bi…...

【Qt5】入门Qt开发教程,一篇文章就够了(详解含qt源码)

目录 一、Qt概述 1.1 什么是Qt 1.2 Qt的发展史 1.3 Qt的优势 1.4 Qt版本 1.5 成功案例 二、创建Qt项目 2.1 使用向导创建 2.2 一个最简单的Qt应用程序 2.2.1 main函数中 2.2.2 类头文件 2.3 .pro文件 2.4 命名规范 2.5 QtCreator常用快捷键 三、Qt按钮小程序 …...

阿里MotionShop——AI视频工具:一键替换视频人物为3D虚拟角色~

近期AI相关的新奇应用层出不穷&#xff0c;今天小元老师要给大家安利一个由阿里巴巴研发的AI视频生成技术——MotionShop&#xff01; 1、一键替换3D虚拟角色 MotionShop通过视频处理、角色检测、背景修复等多重步骤&#xff0c;能够将视频中的人物角色&#xff0c;一键转换成…...

Jetpack Compose实战教程(五)

Jetpack Compose实战教程&#xff08;五&#xff09; 第五章 如何在Compose UI中使用基于命令式UI的自定义View 文章目录 Jetpack Compose实战教程&#xff08;五&#xff09;一、前言二、本章目标三、开始编码3.1 先让自定义控件能跑起来3.2给自定义控件使用compose的方式赋值…...

【vueUse库Watch模块各函数简介及使用方法--上篇】

vueUse库是一个专门为Vue打造的工具库,提供了丰富的功能,包括监听页面元素的各种行为以及调用浏览器提供的各种能力等。其中的Browser模块包含了一些实用的函数,以下是这些函数的简介和使用方法: vueUse库Sensors模块各函数简介及使用方法 vueUseWatch函数1. until2. watc…...

JavaScript中的LHS和RHS

LHS和RHS之前我们先来回忆一下最简单的赋值操作! var test100; console.log(test); 以上代码的意思简单我们理解为把右边的值赋值给左边的test变量,然后输出打印结果。 可是我们要是深入理解你就会发现在这个过程当中&#xff0c;还发生了一些其他的事情 而这些事情就是今天…...

appium 实战问题 播放视频时无法定位到元素

背景 在做UI自动化时&#xff0c;有播放详情页的用例&#xff0c;但是发现视频在播放的时候无法定位到元素或者很慢&#xff0c;了解到appium在动态的页面实时获取布局元素导致定位变慢。所以只能将视频暂停在操作元素&#xff0c;点击到暂停按钮又是个问题&#xff0c;通过ad…...

鸿蒙‘ohpm‘ 不是内部或外部命令,也不是可运行的程序-解决方案

&#x1f525; 博客主页&#xff1a; 小韩本韩&#xff01; ❤️ 感谢大家点赞&#x1f44d;收藏⭐评论✍️ 在鸿蒙的DevEco Studio的终端下输入 ohpm -v 或者 你需要下载第三方ohpm包的时候提示‘ohpm‘ 不是内部或外部命令&#xff0c;也不是可运行的程序- 主要是因为我们…...

方法引用 异常 file

目录 一.方法引用 1.方法引用概述 2.引用静态方法 3.引用成员方法 i.引用其他成员方法 ii.引用本类成员方法 iii.引用父类成员方法 4.引用构造方法 5.其他调用方式 i.使用类名引用成员方法 ii.引用数组的构造方法 二、异常 1.异常的作用 2.异常的处理方式 i.JVM…...

比较(六)利用python绘制径向柱图

比较&#xff08;六&#xff09;利用python绘制径向柱图 径向柱图&#xff08;Circular Barplot&#xff09;简介 径向柱图基于同心圆网格来绘制条形图&#xff0c;虽然不如普通条形图表达准确&#xff0c;但却有抓人眼球的效果。其衍生的南丁格尔玫瑰图则广为人知。 快速绘制…...

为什么需要重写equals和如何重写equals

首先先看Java中的 &#xff0c;比较的两个对象的地址值。 如果是基本数据类型&#xff0c;那么就是比较的是值。 如果是引用数据类型&#xff0c;比较的就是地址. object类中的equals方法也是用的&#xff1b; 所以要比较两个对象的大小&#xff0c;去调用默认的equals方法…...

C#字符串操作:判断一个字符串是否存在于另一个字符串按特定字符分割后的子字符串中的几种方法

要判断一个字符串是否存在于另一个字符串按特定字符分割后的子字符串中&#xff0c;可以使用以下几种方法&#xff1a; 方法一&#xff1a;使用Split和Array.Exists 你可以使用 Split 方法将字符串分割成子字符串数组&#xff0c;然后使用 Exists方法检查目标字符串是否在数组…...

Hi3861 OpenHarmony嵌入式应用入门--MQTT

MQTT 是机器对机器(M2M)/物联网(IoT)连接协议。它被设计为一个极其轻量级的发布/订阅消息传输 协议。对于需要较小代码占用空间和/或网络带宽非常宝贵的远程连接非常有用&#xff0c;是专为受限设备和低带宽、 高延迟或不可靠的网络而设计。这些原则也使该协议成为新兴的“机器…...

[22] Opencv_CUDA应用之 使用背景相减法进行对象跟踪

Opencv_CUDA应用之 使用背景相减法进行对象跟踪 背景相减法是在一系列视频帧中将前景对象从背景中分离出来的过程,它广泛应用于对象检测和跟踪应用中去除背景 背景相减法分四步进行:图像预处理 -> 背景建模 -> 检测前景 -> 数据验证 预处理去除噪声背景建模,以便与…...

Maven在Windows中的配置方法

本文介绍在Windows电脑中&#xff0c;下载、配置Maven工具的详细方法。 Maven是一个广泛使用的项目管理工具&#xff0c;主要针对Java项目&#xff0c;但也可以用于其他类型的项目&#xff1b;其由Apache软件基金会维护&#xff0c;旨在简化和标准化项目构建过程&#xff0c;依…...

一、redis-万字长文读懂redis

高性能分布式缓存Redis `第一篇章`1.1缓存发展史&缓存分类1.1.1 大型网站中缓存的使用带来的问题1.1.2 常见缓存的分类及对比与memcache对比1.2 数据类型选择&应用场景1.2.1 string1.2.2 hash1.2.3 链表1.2.4 set1.2.5 sortedset有序集合类型1.2.6 总结1.3 Redis高级应…...

搞清楚[继承],易如反掌

穷不失义&#xff0c;达不离道。——孔丘《论语》 继承 1、简单理解2、继承2、1、继承的概念2、2、继承定义2、3、基类和派生类对象赋值转换2、4、继承中的作用域2、5、派生类默认成员函数2、6、继承中的特点2、6、1、友元2、6、2、静态成员2、6、3、菱形继承及菱形虚拟继承 3、…...

Perl 语言入门学习指南:探索高效脚本编程的奥秘

引言 Perl&#xff0c;全称Practical Extraction and Report Language&#xff0c;是一种功能强大的编程语言&#xff0c;特别擅长于文本处理、报告生成以及系统自动化管理任务。自1987年诞生以来&#xff0c;Perl凭借其灵活性、强大的内置功能库和广泛的社区支持&#xff0c;…...

【HTML】-解决页面内容无法选择、复制问题

目录 1、网页内容无法选中 1.1、问题原因 1.2、解决脚本 1.2.1、开启控制台窗口 1.2.2、执行脚本命令 2、内容复制弹出阻止框 2.2、解决脚本 1、网页内容无法选中 1.1、问题原因 今天在访问某一网站平台&#xff0c;需要将内容进行选择、复制时发现不可使用。 在使用…...

内存分配函数malloc kmalloc vmalloc

内存分配函数malloc kmalloc vmalloc malloc实现步骤: 1)请求大小调整:首先,malloc 需要调整用户请求的大小,以适应内部数据结构(例如,可能需要存储额外的元数据)。通常,这包括对齐调整,确保分配的内存地址满足特定硬件要求(如对齐到8字节或16字节边界)。 2)空闲…...

黑马Mybatis

Mybatis 表现层&#xff1a;页面展示 业务层&#xff1a;逻辑处理 持久层&#xff1a;持久数据化保存 在这里插入图片描述 Mybatis快速入门 ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/6501c2109c4442118ceb6014725e48e4.png //logback.xml <?xml ver…...

前端倒计时误差!

提示:记录工作中遇到的需求及解决办法 文章目录 前言一、误差从何而来?二、五大解决方案1. 动态校准法(基础版)2. Web Worker 计时3. 服务器时间同步4. Performance API 高精度计时5. 页面可见性API优化三、生产环境最佳实践四、终极解决方案架构前言 前几天听说公司某个项…...

8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂

蛋白质结合剂&#xff08;如抗体、抑制肽&#xff09;在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上&#xff0c;高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术&#xff0c;但这类方法普遍面临资源消耗巨大、研发周期冗长…...

大型活动交通拥堵治理的视觉算法应用

大型活动下智慧交通的视觉分析应用 一、背景与挑战 大型活动&#xff08;如演唱会、马拉松赛事、高考中考等&#xff09;期间&#xff0c;城市交通面临瞬时人流车流激增、传统摄像头模糊、交通拥堵识别滞后等问题。以演唱会为例&#xff0c;暖城商圈曾因观众集中离场导致周边…...

HTML 列表、表格、表单

1 列表标签 作用&#xff1a;布局内容排列整齐的区域 列表分类&#xff1a;无序列表、有序列表、定义列表。 例如&#xff1a; 1.1 无序列表 标签&#xff1a;ul 嵌套 li&#xff0c;ul是无序列表&#xff0c;li是列表条目。 注意事项&#xff1a; ul 标签里面只能包裹 li…...

leetcodeSQL解题:3564. 季节性销售分析

leetcodeSQL解题&#xff1a;3564. 季节性销售分析 题目&#xff1a; 表&#xff1a;sales ---------------------- | Column Name | Type | ---------------------- | sale_id | int | | product_id | int | | sale_date | date | | quantity | int | | price | decimal | -…...

OPenCV CUDA模块图像处理-----对图像执行 均值漂移滤波(Mean Shift Filtering)函数meanShiftFiltering()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 在 GPU 上对图像执行 均值漂移滤波&#xff08;Mean Shift Filtering&#xff09;&#xff0c;用于图像分割或平滑处理。 该函数将输入图像中的…...

动态 Web 开发技术入门篇

一、HTTP 协议核心 1.1 HTTP 基础 协议全称 &#xff1a;HyperText Transfer Protocol&#xff08;超文本传输协议&#xff09; 默认端口 &#xff1a;HTTP 使用 80 端口&#xff0c;HTTPS 使用 443 端口。 请求方法 &#xff1a; GET &#xff1a;用于获取资源&#xff0c;…...

RabbitMQ入门4.1.0版本(基于java、SpringBoot操作)

RabbitMQ 一、RabbitMQ概述 RabbitMQ RabbitMQ最初由LShift和CohesiveFT于2007年开发&#xff0c;后来由Pivotal Software Inc.&#xff08;现为VMware子公司&#xff09;接管。RabbitMQ 是一个开源的消息代理和队列服务器&#xff0c;用 Erlang 语言编写。广泛应用于各种分布…...