簡評: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