var是java 10引入的编译期语法糖,仅用于局部变量声明,需初始化且右侧类型唯一可推断,适用于泛型冗长、明确返回值等场景,但类字段、方法参数等处禁用。

Java 10 引入的 var 不是新类型,也不是动态类型机制,而是编译期的语法糖——它让编译器根据初始化表达式自动补全左侧类型,省去重复书写,同时保持完全的静态类型安全。
哪些地方能用 var
只允许出现在局部作用域中:
- 方法体内(如
void foo() { var x = new ArrayList<string>(); }</string>) - for 循环初始化(
for (var i = 0; i ) - for-each 循环(
for (var item : list),前提是list类型明确) - try-with-resources(
try (var reader = Files.newBufferedReader(path)) { ... })
不能用于:类字段、方法参数、返回类型、catch 参数、lambda 参数(Java 10–13 不支持,Java 14+ 才有限支持)、泛型边界或数组初始化器(如 var arr = {1,2,3} 是非法的)。
必须满足的两个硬性条件
缺一不可:
-
声明时必须初始化:
var s = "hi";✅;var s;❌ 编译失败 -
右侧表达式类型必须唯一可推断:
var list = new ArrayList<string>();</string>→ 推断为ArrayList<string></string>✅var x = null;❌ 无类型依据var y = getString();(若getString()有多个重载且返回类型不一致)→ 编译失败
适合用 var 的典型场景
核心原则:类型一目了然,且简化后不损失语义清晰度:
- 冗长泛型集合:
var map = new HashMap<string list>>>();</string> - 明确返回值的方法调用:
var lines = Files.readAllLines(path);(返回List<string></string>) - 流操作中间变量:
var stream = list.stream().filter(...); - try-with-resources 资源声明:
var conn = dataSource.getConnection();
建议显式写类型的常见情况
不是“不能用”,而是“用了反而容易误导”:
- 右侧是模糊方法调用:
var obj = service.get();—— 读者无法判断返回的是User还是Object - 数值字面量有精度/包装意图:
var id = 128L;推断为long,但业务可能需要Long或int,显式写出更稳妥 - 泛型擦除风险高:
var list = Collections.emptyList();推断为List<object></object>,应写成var list = Collections.<string>emptyList();</string>或直接显式类型 - 变量作用域大、跨多行逻辑、或承担关键契约角色(如配置对象、DTO 实例)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











