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

【JAVA】java泛型 详解

java泛型 详解

    • 一、参数化类型(Parameterized Type):
    • 二. 泛型类(Generic Class):
    • 三. 泛型方法(Generic Method):
    • 四. 通配符类型(Wildcard Type):
    • 五. 类型擦除(Type Erasure):
    • 六. 自动装箱和拆箱(Autoboxing and Unboxing):

Java 泛型是一种在编写类、接口和方法时使用参数化类型的机制,它提供了更强大的类型安全性、代码重用性和可读性。下面详细介绍 Java 泛型的一些关键概念:

一、参数化类型(Parameterized Type):

参数化类型是一种在类、接口或方法中使用的类型,它可以接受一个或多个类型参数。例如,List<String> 是一个参数化类型,表示一个元素类型为字符串的列表。

二. 泛型类(Generic Class):

泛型类是具有一个或多个类型参数的类。类型参数可以在类的声明中使用,并在类的实例化时指定具体的类型。例如:

public class Box<T> {private T value;public void setValue(T value) {this.value = value;}public T getValue() {return value;}
}

在上面的例子中,Box<T> 是一个泛型类,T 是类型参数。在创建 Box 类的实例时,可以指定具体的类型,例如 Box<Integer>Box<String>

三. 泛型方法(Generic Method):

泛型方法是具有一个或多个类型参数的方法。类型参数可以在方法的返回类型之前声明,并在方法调用时指定具体的类型。例如:

public <T> T getObject(T[] array, int index) {return array[index];
}

在上面的例子中,<T> 是类型参数,getObject 方法返回数组中指定索引的元素,且返回类型与数组元素类型相同。

四. 通配符类型(Wildcard Type):

通配符类型是一种特殊的泛型类型,用于表示不确定的类型。通配符类型有三种形式:<?><? extends T><? super T>。参考
【JAVA】泛型,泛型变量,通配符 <?> ,原理及应用详解
【JAVA】 ? super T 和 ? extends T的区别
例如:

<?> 表示任意类型。
<? extends T> 表示某个类的子类。
<? super T> 表示某个类的父类。
通配符类型通常用于方法参数或返回类型中,以提高灵活性。

五. 类型擦除(Type Erasure):

Java 泛型通过类型擦除实现,在编译时会将泛型类型转换为原始类型。这意味着在运行时,泛型类型的信息会被擦除,而泛型参数会被替换为其边界类型或 Object 类型。例如,List<String> 在运行时会被擦除为 List,而 T 会被替换为 Object

这样做是为了确保泛型代码在运行时能够与之前的非泛型代码兼容,因为 Java 虚拟机(JVM)是在泛型被引入之前就存在的。

例如,考虑以下泛型类的定义:

public class Box<T> {private T value;public T getValue() {return value;}public void setValue(T value) {this.value = value;}
}

在类型擦除之后,编译器会将泛型类型 T 擦除为其边界类型或 Object 类型。因此,上述泛型类的擦除版本可能如下所示:

public class Box {private Object value;public Object getValue() {return value;}public void setValue(Object value) {this.value = value;}
}

类型擦除的结果是,尽管在源代码中使用了泛型类型 T,但在编译后的字节码中,泛型类型信息会被擦除,使得所有类型参数都被替换为它们的擦除类型。这意味着在运行时,不再有关于泛型类型的具体信息可用,这种信息已经在编译时被擦除了。

尽管类型擦除在一定程度上降低了泛型的灵活性,但它确保了与之前版本的兼容性,并且使得泛型代码能够在不同版本的 Java 中正常运行。

六. 自动装箱和拆箱(Autoboxing and Unboxing):

Java 泛型支持自动装箱和拆箱,即自动将基本数据类型转换为相应的包装类(装箱),以及自动将包装类转换为基本数据类型(拆箱)。例如,自动装箱可以将 int 转换为 Integer,而自动拆箱可以将 Integer 转换为 int。主要有以下两个作用:

  • 简化代码编写:自动装箱和拆箱使得在基本数据类型和其对应的包装类型之间转换变得更加方便。开发人员不再需要显式地调用 valueOf()xxxValue() 等转换方法,而是可以直接赋值或使用对象,编写更加简洁清晰的代码。
  • 增加类型的灵活性:自动装箱和拆箱使得基本数据类型和包装类型之间的转换更加无缝,提高了类型的灵活性。例如,在集合类中,可以直接存储包装类型的对象,而无需手动将基本数据类型转换为包装类型。这使得代码编写更加灵活,可以更方便地处理不同类型的数据。

Java 泛型提供了一种强大的编程机制,可以提高代码的类型安全性、重用性和可读性。它允许开发人员编写通用的代码,以处理各种类型的数据,同时保持代码的简洁和清晰。

http://www.lryc.cn/news/302418.html

相关文章:

  • 基于RBAC的权限管理的理论实现和权限管理的实现
  • Atcoder ABC340 C - Divide and Divide
  • 趣学贝叶斯统计:概率密度分布(probability density function)
  • 伦敦金行情分析需要学习吗?
  • Java实现停车场收费系统 JAVA+Vue+SpringBoot+MySQL
  • 服务器遭受 DDoS 攻击的常见迹象有哪些?
  • 【机器学习笔记】 15 机器学习项目流程
  • 【C语言】位操作符与移位操作符练习
  • 第十四届“中关村青联杯”全国研究生数学建模竞赛-A题:无人机在抢险救灾中的优化运用
  • Android 9.0 Launcher3桌面显示多个相同app图标的解决办法
  • WordPress主题YIA在广告位添加图片广告时下方有空白怎么办?
  • 5.15 BCC工具之kvm_hypercall.py解读
  • git 解除本地分支与其它分支(远程分支)的关联
  • conda 所有的命令及其讲解
  • mysql 数据库主从复制搭建
  • 小白水平理解面试经典题目LeetCode 1025 Divisor Game【动态规划】
  • 基于单片机的智能宠物喂食器设计
  • 探索单片机应用领域:从智能家居到工业自动化
  • Nginx介绍和使用
  • 异步编程——CompletableFuture用法详解
  • Linux常用命令(不断更新)
  • C++ 浮点数二分 数的三次方根
  • 辽宁博学优晨教育科技有限公司视频剪辑培训专业之选
  • 数据转换成json格式
  • css3的var()函数
  • 武汉灰京文化展望未来游戏产业,科技创新引领全面升级的游戏体验
  • SOLIDWORKS Visualize 界面介绍
  • 负载均衡下webshell连接nginx解析漏洞、sql注入第一关
  • 养老项目技术架构和工程结构
  • 免费白嫖一个互联网创业者交流论坛,真香!