1. 程式人生 > >Java 10 : 區域性變數型別推斷

Java 10 : 區域性變數型別推斷

翻譯:吳嘉俊 ,叩丁狼高階講師。

在所有Java10中出現的JEP規範中,最有趣,並獲得了最多討論的,非JEP286-區域性變數型別推斷(Local-Variable Type Inference)。

什麼是區域性變數型別推斷

在Java7中的菱形操作符允許我們這樣寫程式碼:

List<String> data=new ArrayList<>();

在Java8中,你可以這樣寫:

List<String> data=new ArrayList();

右運算元能夠根據左運算元推斷出型別。Java9中,在匿名內部類中,也同樣適用(修復了該問題)。

Java10更進了一步

List<Map> data = new ArrayList();

這個程式碼在Java10中,可以這樣寫:

var data = new ArrayList<Map>();

注意,這種寫法,我們在右運算元中必須確定泛型的具體引數型別,否則,Java會判定data為一個ArrayList\<Object>。

區域性變數型別推斷允許開發者在申明區域性變數的時候不用顯示申明變數的型別(在方法中的,初始程式碼塊,for迴圈,if-else這樣的程式碼塊中的變數),這些型別會由JDK來推斷。

我們能在什麼地方使用?

下面我用一段程式碼來演示,什麼時候我們能使用var宣告變數:

public class LegalLocalVarInferenceDemo{

    //在static這樣的靜態/初始程式碼塊中
    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;
    }

}

我們不能在什麼地方使用?

我來建立另一個程式碼案例,來演示var不能在什麼地方使用:

public class IllegalLocalVarInferenceDemo{
    //不能在申明類的成員變數的時候
    //var someProperty;

    //不允許作為類的構造方法引數的時候
    // public LocalVarInferenceDemo(var param1){

    // }

    public static void main(String[] args){

        //不允許作為catch的異常型別
        // try{
        //     //some operations
        // }catch(var ex){

        // }
    }

    //不允許作為方法的引數型別宣告
    //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/