简评:Java var != JavaScript var。
Java 10 中引入了新的语法用于局部变量类型推断,不少开发者有所疑惑,但愿这篇文章能帮到你。java
其实在 Java 中类型推断早就存在了,看下下面的例子:函数
public void doSomething() { final List<String> names = new ArrayList<String>(); // ^^^^^^------- Redundant ... }
在这个例子中给 ArrayList
定义持有的类型就不必了,由于 List<String>
已经定义了咱们须要的类型 String
,在 Java 7 中增长了类型推断,这时例子能够直接写成post
public void doSomething() { final List<String> names = new ArrayList<>(); // ^^------ Inferred! ... }
这两种写法是彻底合法的,并且最终会造成同样的字节码。对常常使用泛型的开发者来讲,可能早就对上面的类型推断写法习觉得常。this
即能推断出方法中局部变量的类型,这是 Java 10 中新增的特性,对应关键词 var
,看个例子 :code
public void doSomething() { final ??? name = "Todd"; }
name 是什么类型,很明显是 String
,而 Java 10 就可让编译器帮咱们判断其类型,咱们只要写成下面的形式:索引
public void doSomething() { final var name = "Todd"; // name is inferred as a String! }
var 的使用不局限于函数内声明的变量,同时也能够用于循环的索引:ip
final List<String> names = new ArrayList<>(); public void doSomething() { for(var name: names) { System.out.println("Name: " + name); } for(var i = 0; i < names.size(); i++) { System.out.println("Name: " + names.get(i)); } }
我必须使用 var 吗?不是的,老方法同样完美支持。开发
一个字:不。get
简单说它是受限于它们存在的方法(或循环声明)的范围。这意味着除了声明它们的方法的开发以外,人们不编写依赖于这些类型的代码。编译器
还有你们会有一个疑惑,不少语言也是不须要定义类型的,彻底由编译器搞定,以 JavaScript 举例:
var x = "Todd"
简单吧,x 是 String
类型的,可是在 JS 中能从新定义类型,好比:
var x = "Todd" x = 42 // Now it's an int?!
像这种 Java 之后是否是也不用考虑变量类型了?错,和JS 不同,Java 中的 var 只能在局部变量使用外,同时是不能重复赋值的,就拿上面的例子,会致使编译错误:
public void doSomething() { var x = "Todd"; x = 42; // Compiler fails on this line: // Error: java: incompatible types: int cannot be converted to java.lang.String }
因此 var 一点都不危险,Java 也不会所以变成动态类型分配语言,这仅仅是对局部变量多了一种定义方式。
原文连接: Java Developers: var Is Your Friend • Todd Ginsbergtodd.ginsberg.com