翻譯:叩丁狼教育吳嘉俊
在所有Java10中出現(xiàn)的JEP規(guī)范中,最有趣凝垛,并獲得了最多討論的,非JEP286-局部變量類型推斷(Local-Variable Type Inference)蜓谋。
什么是局部變量類型推斷
在Java7中的菱形操作符允許我們這樣寫代碼:
List<String> data=new ArrayList<>();
在Java8中梦皮,你可以這樣寫:
List<String> data=new ArrayList();
右操作數(shù)能夠根據(jù)左操作數(shù)推斷出類型。Java9中桃焕,在匿名內(nèi)部類中剑肯,也同樣適用(修復(fù)了該問(wèn)題)。
Java10更進(jìn)了一步
List<Map> data = new ArrayList();
這個(gè)代碼在Java10中观堂,可以這樣寫:
var data = new ArrayList<Map>();
注意让网,這種寫法呀忧,我們?cè)谟也僮鲾?shù)中必須確定泛型的具體參數(shù)類型,否則溃睹,Java會(huì)判定data為一個(gè)ArrayList<Object>而账。
局部變量類型推斷允許開(kāi)發(fā)者在申明局部變量的時(shí)候不用顯示申明變量的類型(在方法中的,初始代碼塊因篇,for循環(huán)泞辐,if-else這樣的代碼塊中的變量),這些類型會(huì)由JDK來(lái)推斷竞滓。
我們能在什么地方使用铛碑?
下面我用一段代碼來(lái)演示,什么時(shí)候我們能使用var聲明變量:
public class LegalLocalVarInferenceDemo{
//在static這樣的靜態(tài)/初始代碼塊中
static {
var anotherName = "Sanaulla";
System.out.println("Hello, " + anotherName);
}
public static void main(String[] args){
//可以在方法局部變量中
var name = "Mohamed Sanualla";
System.out.println("Hello " + name);
var data = new ArrayList<Map>();
data.add(Map.of("key1", "value1", "key2", "value2"));
data.add(Map.of("key11", "value11", "key22", "value22"));
System.out.println(data);
System.out.println("As iteration variable in enhanced for-loop");
for ( var object : data){
System.out.println(String.format("%s of type %s", object, object.getClass().getName()));
}
System.out.println("As looping index in for-loop");
for ( var i = 0 ; i < data.size(); i++ ){
var object = data.get(i);
System.out.println(String.format("%s of type %s", object, object.getClass().getName()));
}
System.out.println("As a return value from another method");
var anInteger = someAnotherMethod();
System.out.println("someAnotherMethod returned " + anInteger);
}
//在方法的返回值中
public static Integer someAnotherMethod(){
System.out.println("someAnotherMethod called");
var returnObj = 12;
return returnObj;
}
}
我們不能在什么地方使用虽界?
我來(lái)創(chuàng)建另一個(gè)代碼案例汽烦,來(lái)演示var不能在什么地方使用:
public class IllegalLocalVarInferenceDemo{
//不能在申明類的成員變量的時(shí)候
//var someProperty;
//不允許作為類的構(gòu)造方法參數(shù)的時(shí)候
// public LocalVarInferenceDemo(var param1){
// }
public static void main(String[] args){
//不允許作為catch的異常類型
// try{
// //some operations
// }catch(var ex){
// }
}
//不允許作為方法的參數(shù)類型聲明
//public static void someMethod(var param1, var param2){
// System.out.println("Some method called");
//}
//不允許作為方法返回值類型聲明
// public static var someAnotherMethod2(){
// System.out.println("someAnotherMethod called");
// var returnObj = 12;
// return returnObj;
// }
}
大家可以想想,為什么不能在這些地方使用莉御。
原文地址:https://sanaulla.info/2018/03/04/java-10-jep-286-local-variable-type-inference/
想獲取更多技術(shù)視頻撇吞,請(qǐng)前往叩丁狼官網(wǎng):http://www.wolfcode.cn/openClassWeb_listDetail.html