You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java声明数据结构时,()、<>()与<包装类>()三种写法的差异

Java中泛型集合声明的三种写法差异解析

下面直接拆解你提到的三种写法的核心区别,结合编译规则、类型安全和代码简洁性来看:

1. 仅使用():原始类型实例化

示例代码:

HashSet<String> h = new HashSet();

这是Java 5引入泛型后,为兼容旧代码保留的写法。右边的new HashSet()是原始类型(不带泛型参数的集合类),编译器允许它赋值给左边的泛型变量,但会抛出「未经检查的转换」警告。

  • 核心问题:失去泛型的类型安全保障。比如可以通过反射或非泛型方法往集合里塞入Integer类型元素,编译器不会报错,但运行时取出元素强转成String会直接抛出ClassCastException。
  • 适用场景:仅用于兼容极旧Java代码,不推荐新代码使用。

2. 使用<包装类名称>():显式指定泛型类型

示例代码:

LinkedList<String> l = new LinkedList<String>();

这是Java 5到Java 6时期的标准写法,左右两边都显式声明了相同的泛型类型。

  • 核心优势:完全遵循泛型类型检查规则,编译器会在编译阶段拦截所有不符合泛型类型的元素操作,无警告,彻底保障类型安全。
  • 缺点:代码冗余——左边已明确泛型类型,右边重复书写属于不必要的代码量。

3. 使用<>():钻石运算符自动推断

示例代码:

ArrayList<Integer> list = new ArrayList<>();

这是Java 7及以上版本支持的语法,<>被称为「钻石运算符」。编译器会根据左边变量声明的泛型类型,自动推断右边实例的泛型参数类型。

  • 核心优势:兼顾类型安全和代码简洁性——既保留编译阶段的类型检查(不会出现类型转换异常),又省去了重复书写泛型类型的冗余代码。
  • 注意:Java 7中钻石运算符不能用于匿名内部类,Java 9及以上版本才支持匿名内部类使用该运算符。

总结对比

写法类型编译版本要求类型安全代码冗余度警告情况
仅使用()(原始类型)Java 5+不安全低有「未经检查转换」警告
显式指定<类型>()Java 5+安全高无警告
钻石运算符<>()Java 7+安全低无警告

内容的提问来源于stack exchange,提问作者user22005141

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 13:26:24