java 7起支持菱形语法,编译器根据左侧泛型声明自动推断类型;需左侧有明确泛型类型才能安全使用,java 9扩展至匿名内部类,推荐统一使用但避免与var混用。

Java中泛型类实例化时,用菱形语法 省略右侧类型参数,是自Java 7起支持的写法。它的核心作用是让编译器根据左侧变量声明自动推断类型,既保持类型安全,又避免重复书写。
什么时候能用
必须满足“左侧有明确泛型类型声明”这个前提,编译器才能推断。常见场景包括:
- 声明并初始化变量:如
List<string> list = new ArrayList();</string> - 赋值给已有泛型变量:如
Map<integer string> map = new HashMap();</integer> - 作为方法返回值或参数传递时,上下文类型已知(例如传给接收
List<boolean></boolean>的方法)
哪些情况不能省略或会出问题
省略方式不对,可能丢失类型信息或触发警告:
-
完全不写尖括号:如
List<string> list = new ArrayList();</string>→ 编译器报Unchecked Conversion警告,等价于原始类型,失去泛型保护 -
左侧没写泛型:如
List list = new ArrayList();→ 推断不出具体类型,实际退化为原始类型 -
嵌套泛型层级过深且未显式声明:如
Map<string list>> m = new HashMap();</string>是合法的;但若写成var m = new HashMap();(Java 10+ var),则推断为HashMap<object object></object>,不是预期类型
Java 9起的增强支持
从Java 9开始,菱形语法扩展到了匿名内部类:
- 以前不支持:
new ArrayList<string>() {{ add("a"); }};</string>必须写全类型 - Java 9+ 可写:
new ArrayList() {{ add("a"); }};→ 编译器根据外围上下文(比如赋值给List<string></string>)推断
实际写法建议
日常开发中推荐统一使用菱形语法,但注意三点:
- 左侧类型必须写全(如
Map<string list>></string>),否则推断失效 - 避免和
var混用导致类型模糊,尤其在复杂嵌套场景 - 团队代码规范中可约定:所有泛型实例化一律用
,禁用裸new ArrayList()写法
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











