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

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博客

相关文章:

  • Linux程序开发(十二):线程与多线程同步互斥实现抢票系统
  • 【单片机】STM32F070F6P6 开发指南(一)STM32建立HAL工程
  • VUE2 tab切换导航 展示页面内容(父级子级独立)
  • c语言:模拟strlen(三种方法)最全版本
  • Day03—flask与react实现交互(解决跨域问题)
  • 从容应对亿级QPS访问,Redis还缺少什么?no.29
  • c语言----函数
  • 中间件的概念及示例
  • Android跨进程通信--Binder机制及AIDL是什么?
  • 详解 Cookies 和 WebStorage
  • 软件测试面试题(四)
  • 【经典论文阅读10】MNS采样——召回双塔模型的最佳拍档
  • ffpmeg windows WSl 编译so
  • 【开源】大学生竞赛管理系统 JAVA+Vue+SpringBoot+MySQL
  • leedcode【142】. 环形链表 II——Java解法
  • [js高手之路]搞清楚面向对象,必须要理解对象在创建过程中的内存表示
  • Java程序员幽默爆笑锦集
  • js操作时间(持续更新)
  • maya建模与骨骼动画快速实现人工鱼
  • WinRAR存在严重的安全漏洞影响5亿用户
  • 案例分享〡三拾众筹持续交付开发流程支撑创新业务
  • 浅谈JavaScript的面向对象和它的封装、继承、多态
  • 数据可视化之 Sankey 桑基图的实现
  • 转载:[译] 内容加速黑科技趣谈
  • 3月27日云栖精选夜读 | 从 “城市大脑”实践,瞭望未来城市源起 ...
  • Java性能优化之JVM GC(垃圾回收机制)
  • Java总结 - String - 这篇请使劲喷我
  • Python 之网络式编程
  • 我们雇佣了一只大猴子...
  • ‌Excel VBA进行间比法设计
  • ‌U盘闪一下就没了?‌如何有效恢复数据
  • #### golang中【堆】的使用及底层 ####
  • (10)工业界推荐系统-小红书推荐场景及内部实践【排序模型的特征】
  • (html转换)StringEscapeUtils类的转义与反转义方法
  • (独孤九剑)--文件系统
  • (附源码)springboot车辆管理系统 毕业设计 031034
  • (函数)颠倒字符串顺序(C语言)
  • (四)图像的%2线性拉伸
  • (五)大数据实战——使用模板虚拟机实现hadoop集群虚拟机克隆及网络相关配置
  • (转)清华学霸演讲稿:永远不要说你已经尽力了
  • .bat批处理(一):@echo off
  • .Net 6.0--通用帮助类--FileHelper
  • .NET CF命令行调试器MDbg入门(四) Attaching to Processes
  • .Net core 6.0 升8.0
  • .NET值类型变量“活”在哪?
  • [001-03-007].第07节:Redis中的事务
  • [18] Opencv_CUDA应用之 基于颜色的对象检测与跟踪
  • [AI aider] 打造终端AI搭档:Aider让编程更智能更有趣!
  • [android] 练习PopupWindow实现对话框
  • [Angular] 笔记 9:list/detail 页面以及@Output
  • [codeforces]Checkpoints
  • [Django 0-1] Core.Handlers 模块
  • [elastic 8.x]java客户端连接elasticsearch与操作索引与文档
  • [HTML]Web前端开发技术30(HTML5、CSS3、JavaScript )JavaScript基础——喵喵画网页
  • [I2C]I2C通信协议详解(二) --- I2C时序及规格指引