Java 为什么使用泛型

目录

概述

1. 如下我们需要不同对象打印内容

2. 这时候就可以引入泛型使用

3. 泛型和Object的区别 


概述

Java泛型(Generics)是JDK5.0引入的一种特性,它允许程序员在定义类、接口和方法时使用类型参数(type parameters)。这些类型参数在实例化时(如创建对象或调用方法时)会被具体的类型(如int、String等)所替代。泛型的主要目的是在编译时提供类型安全,并在运行时保持类型信息。

1. 如下我们需要不同对象打印内容

package com.mycompany.printer;public class IntegerPrinter {private Integer content;public IntegerPrinter(Integer content){this.content = content;}public void print(){System.out.println(content);}
}
package com.mycompany.objectcpgeneric;public class PrinterObj {private Object content;public PrinterObj(Object content){this.content = content;}public void print(){System.out.println(content);}
}
    public static void main(String[] args) {IntegerPrinter integerPrinter = new IntegerPrinter(123);integerPrinter.print();StringPrinter stringPrinter = new StringPrinter("I am string");stringPrinter.print();}

/* 运行结果
123
I am string
*/ 

显然如果我们需要的打印的对象越来越多,就需要建立更多对应的打印类,这样是其实有很多的重复代码,有任何需求更新将来会越来越难以统一管理。

2. 这时候就可以引入泛型使用

package com.mycompany.objectcpgeneric;public class PrinterGen<T> {private T content;public PrinterGen(T content){this.content = content;}public void print(){System.out.println(content);}
}
    public static void main(String[] args) {PrinterGen<Integer> printerGen = new PrinterGen<>(123);printerGen.print();PrinterGen<String> printerGen2 = new PrinterGen<>("I am string");printerGen2.print();}

/* 运行结果
123
I am string
*/

3. 泛型和Object的区别 

如1.2中我们使用泛型,为什么不直接使用Object呢?如下我们使用Object去创建这个公共的打印类。

package com.mycompany.objectcpgeneric;public class PrinterObj {private Object content;public PrinterObj(Object content){this.content = content;}public void print(){System.out.println(content);}
}
    public static void main(String[] args) {PrinterObj printerObj = new PrinterObj(123);printerObj.print();PrinterObj printerObj2 = new PrinterObj("I am string");printerObj2.print();}

 /* 运行结果
123
I am string
*/

可以看到Object和泛型的打印效果其实是一样的。
Java有了Object为什么还需要泛型呢?

泛型(Generics)其实是JDK5.0才引入的特性。Java在之前,已经存在Object类,并且所有的类都是Object类的直接或间接子类。然而,Object类作为所有类的“根”,其提供的功能非常基础,例如equals(), hashCode(), toString(), clone(), notify(), notifyAll(), wait(), finalize(), 和 getClass() 等。尽管使用Object类可以在一定程度上实现多态和动态类型,但在处理集合(如List、Set、Map等)时,使用Object类型会带来一些问题:

  • 类型安全性问题:当你从集合中取出元素时,你需要显式地将其转型为你期望的类型。如果转型失败(例如,你期望得到一个String,但实际上集合中存储的是一个Integer),那么在运行时将会抛出ClassCastException。
  • 代码冗余:由于需要在取出元素时进行显式的转型,这会导致代码冗余和潜在的错误。
  • 性能问题:虽然现代JVM对于类型检查和转型操作已经做了优化,但在某些情况下,使用泛型可以避免不必要的类型检查和转型操作,从而提高性能。

泛型的主要优点包括:

  • 类型安全:使用泛型可以确保在编译时检查类型的安全性,从而避免了在运行时抛出ClassCastException。可以设置泛型界限bounded generics。将错误提前到编译阶段发现,而不是运行阶段,有助于让我们提前发现错误。
  • 代码重用和简化:通过定义泛型类和泛型方法,你可以编写更加通用和可重用的代码。此外,由于不需要进行显式的转型操作,代码也会更加简洁。
  • 更好的性能:在某些情况下,使用泛型可以避免不必要的类型检查和转型操作,从而提高性能。
  • 通过使用泛型,可以使用父类的资源。

泛型使用可参考
Java 泛型基础-CSDN博客

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

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

相关文章

MYSQL框架结构

MYSQL框架结构 通过解析器和预处理生成解析树&#xff0c;预处理判断是否合法&#xff0c;如果合法则调用优化器去进行优化。

World Creator v2.1.0 解锁版安装教程 (GPU三维地形生成软件)

前言 World Creator是一款功能相当强大的地形景观生成器&#xff1b;可以完全根据自己的需求来对地形、景观生成您需要三维模型&#xff0c;内置的大量预设&#xff0c;让您的创建拥有无限的可能性。 一、下载地址 下载链接&#xff1a;http://dygod/ITSource 点击搜索&…

蓝卓入选工信部2023年度“揭榜挂帅”项目

蓝卓“面向多元异构和应用快速开发演化的智能工厂操作系统解决方案”&#xff0c;凭借行业领先的平台技术能力以及数智赋能的硬核实力成功揭榜挂帅。 本次入选不仅代表了蓝卓又一次获得工信部权威专家及国家认可&#xff0c;更是“工厂操作系统”首次在国家层面获得表彰。 智能…

【JS】async/await异常捕获,这样做才完美

前言 &#x1f34a;缘由 JS中async/await异步调用&#xff0c;只能通过try-catch吗&#xff1f; &#x1f34d;你想听的故事&#xff1a; 作为一个合格的全栈搬砖工&#xff0c;那必须文武双全&#xff0c;前后必备。遂吾日三省吾身&#xff0c;偶发觉前端长时间不写有些落下…

png格式到oas/gds格式之间的转换方法

想咨询一下万能的CSDN圈: 是否有1-2步,从png格式到oas/gds格式的转换方法. 检索了不少参考资料,需要从png->二值化图像->cif图像->gds格式->oas格式. 这样导出的结果,大概是图像损失极大,当然还没有尝试. 所以想咨询了一下,有偿

宝塔Nginx设置图片访问跨域

宝塔Nginx设置图片访问跨域 针对某一个站点设置 找到对应的站点点击 “设置” 增加对应header设置 代码&#xff1a; location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)${#允许跨域add_header Access-Control-Allow-Origin *;add_header Access-Control-Allow-Headers X-Requeste…

【NumPy】关于numpy.subtract()函数,看这一篇文章就够了

&#x1f9d1; 博主简介&#xff1a;阿里巴巴嵌入式技术专家&#xff0c;深耕嵌入式人工智能领域&#xff0c;具备多年的嵌入式硬件产品研发管理经验。 &#x1f4d2; 博客介绍&#xff1a;分享嵌入式开发领域的相关知识、经验、思考和感悟&#xff0c;欢迎关注。提供嵌入式方向…

【全开源】活动报名表单系统(ThinkPHP+Uniapp+uView)

轻松构建高效报名平台 一、引言 随着线上活动的日益增多&#xff0c;一个高效、易用的活动报名表单系统成为了举办各类活动的必备工具。为了满足不同组织和个人的需求&#xff0c;我们推出了功能强大的“活动报名表单系统源码”。本文将为您详细介绍该源码的特点、功能以及使…

【UE数字孪生学习笔记】 使用DataSmith对模型快速导入 UE5.3.2使用unreal DataSmith文件

声明&#xff1a;部分内容来自于b站&#xff0c;慕课&#xff0c;公开课等的课件&#xff0c;仅供学习使用。如有问题&#xff0c;请联系删除。 部分内容来自UE官方文档&#xff0c;博客等 UE5.3.2使用 3D Max 导出的unreal DataSmith文件 1. 去UE官网下载DataSmith导出器并导…

【Linux】中常见的重要指令(下)以及重要的几个热键

目录 一、时间相关的指令date 1.时间戳 二、Cal指令 三、find指令 1.whereis 2.which 四、grep指令 五、zip和unzip指令 六、tar指令 七、bc指令 八、.重要的几个热键[Tab]&#xff0c;[ctrl]-c&#xff0c;[ctrl]-d 一、时间相关的指令date date 指定格式显示时间…

【Redis精通之路】数据类型(2)

目录 1 Strings 1.1 字符串作为计数器 1.2 限制 1.3 按位运算 1.4 性能 1.5 其他方案 2 JSON 2.1 主要功能 2.2 使用方法 2.3 格式化CLI输出 2.4 启动Redis 2.4.1 Docker 2.4.2 二进制文件 2.4.3 源代码构建 2.4.4 将模块加载到Redis 2.5 限制 2.6 索引 2.7 …

极致优化之道-JVM字节码调优全揭秘

作为Java开发者&#xff0c;我们都渴望能写出高效、流畅的程序。然而性能瓶颈往往来自于意料之外的地方。今天我们将一同揭开JVM字节码调优的神秘面纱&#xff0c;探索通过字节码优化来提升Java程序运行性能的独门秘笈。跟随我一同踏上这条编码优化之路&#xff0c;开启高性能编…

ROM的简单实现

描述 实现一个深度为8&#xff0c;位宽为4bit的ROM&#xff0c;数据初始化为0&#xff0c;2&#xff0c;4&#xff0c;6&#xff0c;8&#xff0c;10&#xff0c;12&#xff0c;14。可以通过输入地址addr&#xff0c;输出相应的数据data。 接口信号图如下&#xff1a; 使用Veri…

Esp32+阿里云物联网平台+DHT11+控制LED(基于PubSubClient库)

Esp32阿里云物联网平台DHT11控制LED 关于本文&#xff1a;利用ESP32连接DHT11温湿度传感器获取温湿度&#xff0c;上报到阿里云物联网平台&#xff0c;通过阿里云物联网平台实时远程查看温湿度&#xff0c;并且接收平台下发的LED灯控制指令。要注意的是&#xff0c;阿里云有两…

【动态规划】零基础解决路径问题(C++)

目录 62.路径问题 解法&#xff08;动态规划&#xff09;&#xff1a; 1. 状态表⽰&#xff1a; 2. 状态转移⽅程&#xff1a; 3. 初始化&#xff1a; 4. 填表顺序&#xff1a; 5. 返回值&#xff1a; 不同路径2.0 解法&#xff08;动态规划&#xff09;&#xff1a; …

22-LINUX--多线程and多进程TCP连接

一.TCP连接基础知识 1.套接字 所谓套接字(Socket)&#xff0c;就是对网络中不同主机上的应用进程之间进行双向通信的端点的抽象。一个套接字就是网络上进程通信的一端&#xff0c;提供了应用层进程利用网络协议交换数据的机制。从所处的地位来讲&#xff0c;套接字上联应用进程…

Python编程入门:从零开始掌握基础

Python编程入门:从零开始掌握基础 Python是一门简单易学但功能强大的编程语言。它广泛应用于数据科学、机器学习、web开发、自动化任务等领域。本系列文章将带你从零开始学习Python,逐步掌握这门语言的基础知识。本文是系列的第一篇,涵盖Python的基本语法、变量和数据类型等…

GitLab的原理及应用详解(七)

本系列文章简介: 随着软件开发的不断进步和发展,版本控制系统成为了现代软件开发过程中不可或缺的一部分。而GitLab作为其中一种流行的版本控制工具,在软件开发领域享有广泛的应用。GitLab不仅提供了强大的版本控制功能,还集成了项目管理、持续集成和部署、代码审查等多个功…

蓝卓supOS工业操作系统应用场景

supOS是国内首个自主知识产权的工业操作系统&#xff0c;也是首个以自动化技术为起点&#xff0c;从下至上推进的开放的以企业为核心的工业互联网平台、工业大数据平台、工业人工智能平台。以工厂全信息集成为突破口&#xff0c;实现生产控制、生产管理、企业经营等多维、多元数…

React 中Redux结合React-Redux使用类组件版本(一)

一、Redux是什么&#xff1f; 1.Redux是一个专门用于状态管理的js库 2.它可以用在React、Angular、Vue的项目中&#xff0c;但基本与React配合使用。 3.作用&#xff1a;集中式管理React应用中多个组件共享的状态。 二、Redux 工作流程 三、Redux的三个核心概念 1.action 动…