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

Java 10 引入了 var 关键字,用于局部变量类型推断,但它**只能用于方法内部的局部变量声明**,不能用于方法参数、返回值、字段或 catch 块参数。它的作用是让编译器根据初始化表达式自动推断变量类型,从而减少冗余的类型重复书写,提升代码可读性(尤其在泛型嵌套较深时)。
哪些情况适合用 var 简化声明
var 最有价值的地方在于:初始化表达式类型明确、不模糊,且类型名较长或嵌套复杂。常见适用场景包括:
- 创建泛型集合,如
var list = new ArrayList<Map<String, List<Integer>>>(); - 调用返回复杂类型的工厂方法或构建器,如
var builder = Json.createObjectBuilder(); - 流操作链的中间结果,如
var filtered = stream.filter(...).map(...);(前提是类型清晰) - try-with-resources 中的资源声明,如
var fis = new FileInputStream("file.txt");
哪些情况不能或不应使用 var
var 不是万能缩写,滥用反而降低可读性或引发编译错误:
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
- 初始化为
null:编译器无法推断类型,var x = null;❌ 编译失败 - 方法返回类型为泛型但未指定类型参数(如原始类型调用),可能导致推断为
Object或意外类型 - 变量用途不直观时,省略类型会增加理解成本,例如
var result = compute();—— 若compute()返回类型不明显,应显式写类型 - lambda 表达式或方法引用直接赋值给
var时,需确保目标函数式接口明确,否则可能推断失败或不准确
实际使用建议
用好 var 的关键是“推断可靠 + 可读不降级”。几个实用技巧:
立即学习“Java免费学习笔记(深入)”;
- 优先在初始化右侧类型一目了然时使用,比如构造器调用、静态工厂方法(
Files.lines()、Collections.emptyList()) - 避免在类型信息承载语义时省略,例如
int timeoutMs = 5000;比var timeoutMs = 5000;更清楚意图(后者推断为int,但无单位提示) - IDE(如 IntelliJ IDEA)支持一键切换:将光标放在已声明的变量上,按
Alt+Enter可快速转换为var或还原为显式类型,方便评估效果 - 团队应约定使用规范,例如“仅在类型名长度 ≥ 30 字符或嵌套 ≥ 2 层泛型时启用
var”
不复杂但容易忽略:var 是语法糖,编译后和显式类型完全等价,运行时无任何开销,也不影响泛型擦除或反射行为。

















