Java中双菱形语法(<>)可省略构造器右侧泛型类型,前提是左侧声明含完整泛型信息;它仅适用于JDK7+的泛型类直接实例化,不支持匿名内部类或无上下文的独立使用。

Java 中用双菱形语法(<>)可以省略构造器右侧的泛型类型,让实例化更简洁,前提是编译器能根据左侧声明或上下文推断出类型。
双菱形语法的基本写法
在创建泛型对象时,把原本重复写的类型参数替换成 <>,即“钻石操作符”:
- 传统写法:
Map<String, List<Integer>> map = new HashMap<String, List<Integer>>(); - 双菱形写法:
Map<String, List<Integer>> map = new HashMap<>();
注意:左侧声明必须包含完整泛型类型,否则编译器无法推断;右侧的 <> 不是空泛型,而是复用左侧的类型信息。
支持的场景和限制
双菱形语法适用于大多数泛型类的直接实例化,但有几点要注意:
立即学习“Java免费学习笔记(深入)”;
- 仅适用于构造器调用,不能用于方法返回值或泛型方法调用中单独使用
<> - Java 7 引入,要求 JDK 7+;低版本不支持
- 匿名内部类不支持,例如
new ArrayList<>() {{ add("x"); }}会编译失败 - 如果构造器有重载且类型擦除后签名相同,可能导致推断失败或编译错误
配合类型推断提升可读性
结合 var(Java 10+)可进一步简化:
-
var list = new ArrayList<String>();→ 编译器推断为ArrayList<String> -
var map = new HashMap<String, Integer>();→ 推断为HashMap<String, Integer>
此时双菱形语法仍可省略右侧类型:var map = new HashMap<>(); 同样合法,因为 var 的类型由右侧决定,而 new HashMap<>() 的实际类型仍由上下文或构造器签名辅助推断。
常见误用与修复
以下写法容易出错:
-
错误:
Map map = new HashMap<>();—— 左侧没写泛型,右侧无法推断,编译失败 -
错误:
return new ArrayList<>();在方法中单独返回,无上下文类型信息,编译报错 -
正确:
Map<String, Object> m = new HashMap<>();或foo(new HashMap<>());(若方法参数是Map<String, Object>)


















