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/

 

展开阅读全文

没有更多推荐了,返回首页