java 10 中 var 关键字(类型推断)使用教程

/ Java / 没有评论 / 1346浏览

java 10 中 var 关键字(类型推断)使用教程

Java 10 是在2018年3月20号正式发布的,其中的新特性之一就是 var 关键字。它将我们常常在JS里面使用的var 变量引入到语言特性中,把我们从那些冗长的变量声明中解放出来。以后我们在声明变量时,可以采用下面的方式:

var xttblog = new ArrayList<Xttblog>();

大家都知道 java 是一门强类型语言。也就是要显式声明各个变量的确切类型,稍有不慎编译器就会报错。例如我们创建一个对象,输入两次类型,一次是引用类型声明,另一次是构造函数。如下面的用法:

String xttblog = new String("业余草:www.xttblog.com");

再比如,一个方法的返回类型是 Xttblog,那我们必须使用 Xttblog 类型来接受这个返回值。比如下面的代码:

Xttblog xttblog = XttblogCom.getXttblog();

讨厌 java 的人,经常吐槽 java 的强类型语言。它太麻烦了,让人头大。现在有了 java 10 的 var 关键字,一切都变的那么简单。

var 类型推断机制

程序在处理 var 类型时,编译器先是查看表达式右边部分,也就是所谓的构造器,并将它作为变量的类型,然后将该类型写入字节码当中。

那么这么说,是不是我以后只用 var 类型,其他类型都可以不用呢?

当然不行,如果这样的话,其他基本数据类型还有存在的必要吗?而且我上面说了,编译器在处理时,会自动的判断右侧是什么类型,并将它作为变量类型。常见的类似,下面的使用就不被允许:

var foo; foo = "Foo";
var ints = {0, 1, 2};
var appendSpace = a -> a + " ";
private var getFoo(){}

java 官方强调了,var 只能用于带有构造器的局部变量,唯一例外的是 for 循环:

var numbers = List.of("a", "b", "c");
for (var nr : numbers)
System.out.print(nr + " ");
for (var i = 0; i < numbers.size(); i++)
System.out.print(numbers.get(i) + " ");

JEP 286’的标题是“局部变量类型推断”, 看名称就可以知道使用范围:局部变量。更加确切的说法是:具有初始化器的局部类型变量声明。所以你们不要把它想的太强大,太无敌了。

var foo;foo = "www.xttblog.com";// 错误用法
var foo = "xttblog.com";// 正确用法

通过上面的举例,我们得出一个结论。字段、方法签名、catch子句仍然需要显示类型声明。

还有 var 类型一旦确定具体的变量类型后,就不能再变更类型了。比如下面的这些用法,都是错误的:

var users = new ArrayList<User>();
users = new LinkedList<>();

var id = 123;
if (id < 100) {
    id = "业余草:www.xttblog.com";
} else {
}

根据 java 的官方调查得知,var 类型的推出,74% 的用户都是支持的,12% 的中度支持。反正我也是支持的,就算你想拒绝也是拒绝无效!

java 10 中 var 关键字常见异常汇总

variable initializer is 'null'

当抛出 variable initializer is 'null' 异常意味着你对 var 类型的变量赋了 null 值。

var name = null;

这是不被允许的!因为 null 不是一个类型。

lambda expression needs an explicit target-type

抛出这个异常,意味着没有Lambda初始化器。

var runnable = () -> {}

这是因为RHS需要依赖LHS的类型推断。

method reference needs an explicit target-type

抛出这个异常,意味这你的方法没有引用初始值。

var xttblog = BigDecimal::abs

array initializer needs an explicit target-type

抛出这个异常,意味着你的数字初始化用法不正确。

var numbers[] = new int[]{2, 4, 6};// 不能有[]
var numbers = {2, 4, 6};// 错误用法

正确的用法如下:

var numbers = new int[]{2, 4, 6};

'var' is not allowed as an element type of an array

抛出这个异常,意味着var和[]被你放在同一边了。

var xttblog[] = {2, 4, 6};

var和[]不能同时用在LHS一边。

结合我的上一篇文章,我相信你了解了所有var类型的功能和限制,什么时候可以使用var,什么时候不可以使用var。