资讯专栏INFORMATION COLUMN

猫头鹰的深夜翻译:Java 10的JEP 286-局部变量类型推断

chavesgu / 3449人阅读

摘要:在此基础上又向前迈进了一步局部变量类型推断允许开发人员跳过局部变量的类型声明局部变量是指在方法定义,初始化块,循环和其它的如代码块,会推断该局部变量的类型。

前言

之前面试的时候问了我是否了解JDK10的变化,一时回答不出来,所以只回答了JDK8中的函数式编程和流编程。今天看到这篇讲JAVA10的文章,顺便了解一下。

正文

JAVA10的所有新特性请参考这里。在所有的JEP中,JEP-286在社区中引发了热烈的讨论。因此今天将介绍此特性。

什么是局部变量类型推断

在JAVA8中,我们可以将下面这样使用的菱形运算符:

List data = new ArrayList();

转化为:

List data = new ArrayList<>();

RHS上的类型通过LHS上的类型来推断。

Java 10在此基础上又向前迈进了一步:

var data = new ArrayList<>();

局部变量类型推断允许开发人员跳过局部变量的类型声明(局部变量是指在方法定义,初始化块,for循环和其它的如if-else代码块),JDK会推断该局部变量的类型。

在哪里使用?

下面我写一个样例代码来展示使用局部变量推断var的不同的方法:

public class LegalLocalVarInferenceDemo{
 
    //在静态或是实例化的代码块中
    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<>();
        data.add(Map.of("key1", "value1", "key2", "value2"));
        data.add(Map.of("key11", "value11", "key22", "value22"));
        data.add("hello");
        System.out.println(data);
 
        System.out.println("********** As iteration variable in enhanced for-loop ***************");
        //for循环中
        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循环中
        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);
 
    }
 
    //As a return value in a method
    public static Integer someAnotherMethod(){
        System.out.println("someAnotherMethod called");
        var returnObj = 12;
        return returnObj;
    }
 
}
何时不能使用?
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;
    // }
}
补充官网上的例子
Main.java:81: error: cannot infer type for local
variable x
        var x;
            ^
  (cannot use "val" on variable without initializer)

Main.java:82: error: cannot infer type for local
variable f
        var f = () -> { };
            ^
  (lambda expression needs an explicit target-type) 

Main.java:83: error: cannot infer type for local
variable g
        var g = null;
            ^
  (variable initializer is "null")

Main.java:84: error: cannot infer type for local
variable c
        var c = l();
            ^
  (inferred type is non denotable)

Main.java:195: error: cannot infer type for local variable m
        var m = this::l;
            ^
  (method reference needs an explicit target-type)

Main.java:199: error: cannot infer type for local variable k
        var k = { 1 , 2 };
            ^
  (array initializer needs an explicit target-type)
参考资料
JRE-286


想要了解更多开发技术,面试教程以及互联网公司内推,欢迎关注我的微信公众号!将会不定期的发放福利哦~

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/68716.html

相关文章

  • Java 10 新特性解密,引入类型推断机制,2018 年 3 月 20 日发布

    摘要:目标发布目前有两个主要功能针对局部变量类型推断这将删除大部分对象实例化所需的冗长的包含手动类型信息整合源树的库即不同的库将被合并成一个单一的存储库。特别是,承诺为局部变量实例化引入类型推断机制,并将现有的存储库合并到一个存储库中。 JDK 10 何时发布? JDK 10 是 Java 10 标准版的部分实现,将于 2018 年 3 月 20 日发布,改进的关键点包括一个本地类型推断、一...

    caspar 评论0 收藏0
  • Java新版本开发已正式进入轨道,版本号18.3

    摘要:在月日正式发布,同时宣布将新版本的发布周期调整为每半年一次。目前,新版本的开发也已正式进入轨道。提议在中引入局部变量的类型推断,该在年提出,曾经报道过该的概况和相关的开发者调查结果。它会减少开发人员在声明局部变量时,没有必要的变量类型声明。 Java 9在9月21日正式发布,同时Oracle宣布将Java新版本的发布周期调整为每半年一次。目前,Java新版本的开发也已正式进入轨道。就已...

    graf 评论0 收藏0
  • JDK 10 新特性和增强功能

    摘要:的问题在于,版本号中编码了它和它对之前版本的兼容性信息。但是在六个月节奏的情况下,这些信息都是未知的,在发布前任何事情都可能发生,由此规范下的版本号也会是未知的。程序会对文件的完整性做一个保护,因此修改既可能丢失。 本文是对底部参考资料的整理得到的,由于本人技术水平和英语水平都不是很高,有些词如有翻译错误或句子的理解错误还请指出。 JEP 286 局部变量推断: var 传统的 J...

    yibinnn 评论0 收藏0
  • Java 1010个新特性,将彻底改变你写代码方式!

    摘要:的新特性说了这么多,看都会有哪些特性来改变我们写代码的方式呢局部变量类型推断局部变量类型推断可以说是中最值得注意的特性,这是语言开发人员为了简化应用程序的编写而采取的又一步,如下图所示。 showImg(https://segmentfault.com/img/remote/1460000015356980); Java 9才发布几个月,很多玩意都没整明白,现在Java 10又快要来了...

    ityouknow 评论0 收藏0
  • Java 10新特性:类型推断

    摘要:实际上并未引入太多新特性,不过有一个新特性最引人注目等了这么久终于支持类型推断了,那么今天就来看一看的类型推断,和其他语言相比有哪些异同吧。本次更新也支持了类型推断,对于这种重量级语言来说还是一件值得高兴的事。 0x01 Java 10简介 自从有了校内的下载网站,很少上Oracle官网下载JDK了,结果前两天听钟神说Java 10都出来了2333。干IT这行还真是要与时俱进啊,那就...

    afishhhhh 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<