一分钟彻底掌握java泛型

Java中的泛型(Generics)

在Java中,泛型是JDK 5引入的一个非常重要的特性,它允许你在定义类、接口和方法时使用类型参数(type parameters)。使用泛型的主要好处是可以提供编译时的类型检查,减少类型转换的代码,并增强代码的可读性和可重用性。

0.通俗理解

想象一下,你有一个大箱子(类),这个箱子可以装很多东西,比如苹果、橙子或者玩具车。但是,每次你只能装一种东西,并且一旦你决定装苹果,那么这个箱子就只能装苹果了,不能装橙子或玩具车。这样虽然可以,但不是很灵活。
现在,有了“泛型”这个神奇的工具,你可以把这个箱子变成一个“万能箱”。这个“万能箱”在制造的时候并没有决定要装什么,而是留了一个“空位”给你来指定。你可以告诉它:“我要装苹果”,于是它就变成了装苹果的箱子;你也可以说:“我要装橙子”,它就变成了装橙子的箱子。甚至你还可以说:“我要装玩具车”,它也能满足你的需求。
这个“空位”就是泛型中的“类型参数”,你可以把它想象成一个可以插入不同类型的小插片。当你插入“苹果”插片时,箱子就变成了苹果箱;插入“橙子”插片时,就变成了橙子箱。
使用泛型的好处是,你可以编写更加通用的代码,而不需要为每种类型都写一遍。比如,你可以写一个通用的“万能箱”类,然后告诉它你要装什么,它就能自动适应。这样,你的代码就更加灵活、可重用,而且减少了出错的可能性。
所以,泛型就像是一个魔法箱子,让你的代码更加灵活、高效和通用。

1. 泛型类

泛型类就是使用类型参数声明的类。类型参数在类声明中定义,然后在整个类体中使用。

public class Box<T> {private T t;public void set(T t) { this.t = t; }public T get() { return t; }public static void main(String[] args) {Box<Integer> integerBox = new Box<>();integerBox.set(new Integer(10));System.out.println(integerBox.get() * 2); // 输出 20Box<String> stringBox = new Box<>();stringBox.set("Hello World");System.out.println(stringBox.get().toUpperCase()); // 输出 HELLO WORLD}
}

在上面的例子中,Box类是一个泛型类,它使用了一个类型参数T。然后我们在main方法中创建了两种类型的Box对象:Box<Integer>Box<String>

  • 补充
    你可以在使用泛型类时不指定泛型参数,但是这样做会失去泛型的一些优点,如类型安全和避免不必要的类型转换。 例如,你可以创建一个没有指定泛型参数的 ArrayList:ArrayList list = new ArrayList();
    这个 list 可以添加任何类型的对象。但是,当你从 list 中获取元素时,你需要进行类型转换,因为 list.get(int index) 方法将返回一个 Object 类型的引用。 如果你在创建 ArrayList 时指定了泛型参数,如 ArrayList<String>,那么这个 ArrayList 只能添加 String 类型的对象,尝试添加其他类型的对象将导致编译错误。同时,list.get(int index) 方法将返回一个 String 类型的引用,无需进行类型转换。 因此,虽然可以在使用泛型类时不指定泛型参数,但是为了获取泛型的优点(如类型安全和避免类型转换),建议在使用泛型类时指定泛型参数。
2. 泛型接口

和泛型类类似,泛型接口也是使用类型参数声明的接口。

public interface List<E> {void add(E element);E get(int index);// ... 其他方法
}

虽然上面的List接口和Java标准库中的java.util.List接口很相似,但这里只是为了示例。

3. 泛型方法

泛型方法是指使用类型参数声明的方法。类型参数在方法签名中定义,然后在方法体中使用。

public class GenericMethods {// 泛型方法,使用类型参数Tpublic static <T> void printArray(T[] array) {for (T item : array) {System.out.print(item + " ");}System.out.println();}public static void main(String[] args) {Integer[] intArray = {1, 2, 3, 4, 5};printArray(intArray); // 输出整数数组String[] stringArray = {"Hello", "World"};printArray(stringArray); // 输出字符串数组}
}

在上面的例子中,printArray是一个泛型方法,它接受一个类型参数T,并打印出该类型数组的所有元素。

4. 类型通配符(?)

在Java中,?是一个特殊的类型通配符,它表示未知的类型。类型通配符主要用于泛型方法和泛型类的参数定义中。

List<?> wildcardList = new ArrayList<String>();
// wildcardList.add(new Object()); // 编译错误,因为不知道具体类型if (wildcardList instanceof List<String>) { // 注意:这种instanceof检查是不合法的// ...
}

不过,类型通配符还提供了两种限制:上界(extends)和下界(super)。

  • 上界(extends):表示类型参数必须是某种类型的子类型。
List<? extends Number> numberList = new ArrayList<Integer>();
// numberList.add(new Double(3.1415)); // 编译错误
Number n = numberList.get(0); // 没问题
  • 下界(super):表示类型参数必须是某种类型的超类型(或相同类型)。
List<? super Integer> intList = new ArrayList<Number>();
intList.add(new Integer(10)); // 没问题
// Number n = intList.get(0); // 编译错误,因为可能是Number的其他子类型
5. 泛型擦除(Type Erasure)

在Java中,泛型是通过类型擦除来实现的。这意味着在运行时,泛型信息会被擦除,所有的泛型类型都会变成原始类型(raw type)。这就是为什么你不能在运行时检查一个对象是否是某个泛型类型的实例(如上面的instanceof检查)。但是,Java编译器会在编译时检查泛型的使用,确保类型安全。

总结

泛型是Java中一个非常强大的特性,它允许我们编写更加灵活和可重用的代码。通过使用泛型,我们可以减少类型转换的代码。

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

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

相关文章

【M365运维】Outlook和Teams里不显示用户的组织架构

【问题】 由于一些误操作&#xff0c;把用户账户禁用并重新启用后&#xff0c;发现在Outlook和Teams里无法查看用户的组织结构图了。如下图所示&#xff1a; - 在Outlook 里&#xff0c;用户标签页的组织一直显示“正在加载..."&#xff0c;成员身份也是“找不到任何组。…

【GD32】08 - IIC(以SHT20为例)

GD32中的IIC 今天来了解一下GD32中的硬件IIC&#xff0c;其实我个人是觉得软件IIC比较方便的&#xff0c;不过之前文章里用的都是软件IIC&#xff0c;今天就算是走出自己的舒适圈&#xff0c;我们来了解了解GD32中的硬件IIC。 我这里用的型号是GD32F407&#xff0c;不同型号的…

等保测评初级简答题试题

基本要求&#xff0c;在应用安全层面的访问控制要求中&#xff0c;三级系统较二级系统增加的措施有哪些&#xff1f; 答&#xff1a;三级比二级增加的要求项有&#xff1a; 应提供对重要信息资源设置敏感标记的功能&#xff1b; 应按照安全策略严格控制用户对有敏感标记重要…

策略模式和状态模式

策略模式 在上下文中携带策略接口作为成员变量&#xff0c;在使用上下文之前需要设置策略setStrategy&#xff08;&#xff09;&#xff0c;然后使用策略接口成员变量来进行策略的执行。 步骤1&#xff1a;定义策略接口 // 策略接口 public interface Strategy {int execut…

猎豹WiFi

猎豹WiFi&#xff0c;记得刚安装完就一堆广告弹窗&#xff0c;然后删除了一些东西&#xff0c;不影响开热点的功能。 kwifi.zip - 蓝奏云

干涉阵型成图参数记录【robust】

robust 这个玩意经常忘记&#xff0c;就是取2的时候是更加显示大尺度的结构&#xff0c;取-2更加显示小尺度结果&#xff0c;一般取0就是正常就好了

真正要战胜的,不是困难,是自己

记录一些好的文字&#xff0c;希望可以和大家共勉。 一个人真正的成长&#xff0c;是战胜自己 不知你是否有这样的经历&#xff1a;曾经觉得一道题很难&#xff0c;但解出来后&#xff0c;发现其实并没那么难&#xff1b;曾经觉得一件事是不可能完成的&#xff0c;但历经千辛万…

vitest-前端单元测试

Vitest是一个轻量级、快速且功能强大的测试框架&#xff0c;特别适用于Vite项目&#xff0c;但也可以与其他前端项目&#xff08;如使用webpack构建的项目&#xff09;集成使用。Vitest提供极速的测试体验&#xff0c;并包含一系列用于编写和组织测试用例的API&#xff0c;如de…

vue项目中,pnpm不能用-解决

方法四&#xff1a;解决 PowerShell 执行策略问题 如果你决定继续使用 PowerShell&#xff0c;并且遇到执行策略问题&#xff0c;可以尝试以下方法解决&#xff1a; 永久更改执行策略&#xff1a; 在管理员权限的 PowerShell 中运行以下命令&#xff0c;以永久更改执行策略&am…

【Hive中常见的优化手段----数据采集!Join 优化!Hive索引!数据倾斜!mapreduce本地模式!map和reduce数量调整!】

前言&#xff1a; &#x1f49e;&#x1f49e;大家好&#xff0c;我是书生♡&#xff0c;今天主要和大家分享一下Hive中常见的优化手段----数据采集&#xff01;常见的Join 优化有哪几种&#xff01;什么是Hive索引&#xff01;数据怎么发生倾斜&#xff01;什么是mapreduce的本…

力扣每日一题 6/24 模拟 数组 单调栈

博客主页&#xff1a;誓则盟约系列专栏&#xff1a;IT竞赛 专栏关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ 503.下一个更大元素II 【中等】 题目&#xff1a; 给定一个循环数组 nums…

数据分析师怎么去快速读一本书

背景&#xff1a;优秀的数据分析师怎么去快速读一本书 一本好书的判断依据 1.有没有再次印刷&#xff0c;三次印刷一般是好书 2.作者 快读选书顺序 1.目录->定位这是一本什么书 2.看内容的呈现形式&#xff0c;内容的各部分占比大概是什么类型的信息。 3.去看自己擅长的知…

使用原子子表创建可重用的子组件

原子子表是一个图形对象&#xff0c;可帮助您在Stateflow图表中创建独立的子部件。原子子表允许&#xff1a; 对具有多个状态或层次结构的图表进行微小更改后&#xff0c;模拟速度更快。 在多个图表和模型中重复使用相同的状态或子表。 易于团队开发&#xff0c;适用于在同一图…

在现代多核和多线程环境中,如何优化 C 语言程序以充分利用硬件并行性?

在现代多核和多线程环境中&#xff0c;要优化C语言程序以充分利用硬件并行性&#xff0c;可以考虑以下几点&#xff1a; 并行算法设计&#xff1a;将任务分解为多个独立的子任务&#xff0c;并使用多线程或多进程同时执行这些子任务。这可以通过将问题分解为多个部分&#xff0…

小阿轩yx-MySQL备份与恢复

小阿轩yx-MySQL备份与恢复 企业对信息系统依赖性越来预高&#xff0c;数据库担任着重要角色如果发生意外宕机或数据丢失&#xff0c;损失是非常严重的数据库管理员必须针对具体的业务要求制定详细的数据库备份与灾难恢复策略 对数据库要求高的行业 银行证券电信等 MySQL 数…

PHP的SHA256WithRSA签名和Curl POST请求函数

getCustomerEncryptionKey - 获取加密秘钥 /** * 获取加密秘钥 * param array $params * return string */ public function getCustomerEncryptionKey(array $params): string { //1.ASCII码&#xff08;字典序-升序&#xff09;排序…

Python网络爬虫实战6—下一页,模拟用户点击,切换窗口

【前期提要】感兴趣的可以看看往期文章哈~ Python网络爬虫5-实战网页爬取 Python网络爬虫4-实战爬取pdf Pyhon网络爬虫3-模拟用户点击 Python网络爬虫实战2-下载url下的pdf Python网络爬虫基础1 1.需求背景 针对长虹美菱电器说明书网页形式&#xff0c;编写爬虫代码&#xff…

IO模型简介

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言简介正文实现总结 前言 简介 Java1.4之前的早期版本,Java对I/O的支持并不完善,开发人员在开发高性能I/O程 序的时候,会面临一些巨大的挑战和困难,主要问题如下…

A36 STM32_HAL库函数 之PCD通用驱动 -- B -- 所有函数的介绍及使用

A36 STM32_HAL库函数 之PCD通用驱动 -- B -- 所有函数的介绍及使用 1 该驱动函数预览1.11 HAL_PCD_SOFCallback1.12 HAL_PCD_ResetCallback1.13 HAL_PCD_SuspendCallback1.14 HAL_PCD_ResumeCallback1.15 HAL_PCD_ISOOUTIncompleteCallback1.16 HAL_PCD_ISOINIncompleteCallbac…

【财务数字化转型之底座】集团企业财务数据中台系统建设方案

引言&#xff1a;随着企业规模的不断扩大和业务的复杂化&#xff0c;传统的财务管理模式已难以满足集团企业的数据整合、分析和决策需求。因此&#xff0c;建设一个高效、稳定、安全的财务数据中台系统&#xff0c;成为集团企业数字化转型的重要一环。本方案旨在构建一个集数据…