Java 10局部变量类型推断var的用法与限制
请解释Java 10引入的var关键字(局部变量类型推断)。var在哪些场景可以使用?哪些场景不能使用?var与动态类型(如JavaScript的var)有什么区别?var的底层实现原理是什么?
回答
专业代码师
var:局部变量类型推断,编译器根据右侧初始化表达式推断变量类型。
可用场景:
- 局部变量(方法体内)
- for循环的索引变量:
for (var i = 0; i < 10; i++) - 增强for循环:
for (var item : list) - try-with-resources:
try (var fis = new FileInputStream(...))
不可用场景:
- 成员变量(字段)
- 方法参数
- 方法返回类型
- 没有初始化表达式:
var x;❌ - 初始化为null:
var x = null;❌ - Lambda表达式(需要目标类型推断)
- 数组初始化:
var arr = {1, 2, 3};❌
与动态类型区别:
- Java的var是静态类型,编译期确定类型,运行时类型固定
- JavaScript的var是动态类型,运行时可改变类型
- Java var变量赋值后不能改变类型(
var x = "hello"; x = 123;❌)
底层原理:
- 纯语法糖,编译时被替换为实际类型
- 生成的字节码与显式类型完全相同(无运行时开销)
- 不影响泛型擦除等机制
最佳实践:
✅ 用于泛型嵌套类型(如var map = new HashMap<String, List<String>>())
✅ 用于明显类型的表达式(var list = List.of(1,2,3))
❌ 避免用于使代码可读性降低的场景(如var result = someMethod(),当返回类型不明确时)