0%

Java语言新特性漫谈:Java 10之局部变量类型推断

本文是《Java语言新特性漫谈》系列文章中的一篇,该系列文章主要探讨各 Java 版本的语言特性方面的增强更新。

var声明的局部变量

Java 是静态语言,所以变量声明时需要指定类型。

但是,对于局部变量而言,通常在声明时就会给其赋值。比如:

1
2
String hi = "Hello! World!";
String ha = new String("Hahaha!");

这种场景下,我们实际是可以从等号右侧的值推断出左侧变量的类型的。换句话说,显式声明变量的类型是完全没有必要的。
因此,Java 10 加入了局部变量类型推断的能力,使得不必做无谓的工作量。仅仅将类型名替换为 var 即可,如:

1
var hi = "Hello! World!"

var 看起来像 JavaScript 的 var 关键字,但是,并不意味着 Java 因此拥有了动态类型。

基于兼容性考虑,var 并非关键字,而仅仅是一个保留类型名。换句话说,声明 var 作变量名是完全合法的。

事实上,这只是一个编译器特性,编译器会在编译时推断出变量类型进行替换。

关于推断

首先,该能力是有范围限定的,是关于“局部变量”的;其次,可推断本身是要有条件的。

因此,以下场景使用 var 声明变量是非法的:

  1. 用于非局部变量是不合法的。包括:类变量、实例变量、方法参数等等。
  2. 未给变量赋值,或所赋值无法确认类型时,也是不合法的。
  3. 变更 var 变量类型是非法的。var 并不意味着动态类型,因此不能重新赋值一个不兼容的类型值。
1
2
3
4
5
6
7
8
// 未赋值,没有推断依据
var one;
// null 没有明确类型
var nullValue = null;
// Lambda 表达式类型本身就需要根据目标类型进行推断,形成循环推断依赖
var supplier = () -> "Lambda";
// 由于潜在的复杂性,并未实现该推断场景
var arr = { 1, 2, 3 };

优点 vs. 缺点

var 变量主要有以下优点:

  1. 简洁,提高了可读性;
  2. 一系列变量声明时,变量名可对齐,排版美观;

反过来说,它也可能降低可读性。比如等号右侧是以方法调用结果赋值,甚至是以链式调用结果赋值时,变量类型就不是那样明显了。此时,应该尽量显式指定变量类型。

参考