Java 9 菱形操作符扩展:匿名内部类也能用 <> 推断
背景
Java 7 引入菱形操作符 <> 简化泛型构造,但匿名内部类构造器调用不支持。Java 9 移除此限制,匿名类也可用 <> 推断类型参数。
代码对比
Java 8 写法(冗余类型参数)
Handler intHandler = new Handler(1) {
@Override public void handle() { System.out.println(content); }
};
Handler extends Number> intHandler1 = new Handler(2) {
@Override public void handle() { System.out.println(content); }
};
Handler> handler = new Handler
Java 9+ 写法(菱形推断)
Handler intHandler = new Handler<>(1) {
@Override public void handle() { System.out.println(content); }
};
Handler extends Number> intHandler1 = new Handler<>(2) {
@Override public void handle() { System.out.println(content); }
};
Handler> handler = new Handler<>("test") {
@Override public void handle() { System.out.println(content); }
};
抽象基类
abstract class Handler {
public T content;
public Handler(T content) { this.content = content; }
abstract void handle();
}
输出
1
2
test
类型推断规则
- 目标类型(赋值左侧)提供类型参数上下文。
- 构造器参数类型辅助推断。
- 匿名类隐式继承/实现的泛型超类型参与推断。
- 若推断失败(如目标类型为原始类型
Handler),编译报错需显式提供参数。
适用范围
- 匿名类构造器调用。
- 实例创建表达式(
new Type<>())。 - 不适用于:方法调用、字段声明、数组创建、显式类型参数方法调用。
java
- 深入理解 Java final 关键字:变量、方法与类的不可变性
- Java instanceof 运算符完全指南:用法、继承与接口检查
- 精通 Java 继承:核心概念、类型与实战示例
- 精通 Java 嵌套类与内部类:类型、示例与最佳实践
- 深入理解 Java 静态嵌套类:用法、差异与实战示例
- 精通 Java 匿名内部类:定义、语法与实战示例
- Java 单例模式详解:安全实现与使用指南
- 精通 Java 反射:运行时检查类、方法与字段
- 精通 Java ArrayList:操作、方法与最佳实践
- 掌握 Java ObjectOutputStream:序列化、核心方法与实战示例
- 掌握 Java 泛型:构建可复用、类型安全的代码
- 掌握 Java 文件操作:java.io 包下的创建、读取、写入与删除