Java10的局部变量类型推断

开课吧开课吧锤锤2021-07-01 14:24

    我们已经在Java历史上多次看到语言设计者添加“类型推断”来帮助我们编写更简洁的代码。类型推断是一种思想:编译器可以帮你推出静态类型,你不必自己指定它们。

局部变量类型

    随着类型越来越多,泛型参数有可能是另一个泛型,这种情况下类型推导可以增强可读性。Scala和C#语言允许将局部变量的类型声明为var,由编译器根据初始化语句来填补合适的类型。比如,前面对userChannels的声明可以写成这样:局部变量类型

    也可以是根据方法的返回值(这里返回列表)来推断:

局部变量类型

    这种思想称为局部变量类型推断,它已经在Java10中引入!

    例如下面的代码:

局部变量类型

    在Java10中可以重构成这样:

局部变量类型

    上述代码中的每个表达式仍然是静态类型(即值的类型):

    局部变量path的类型是Path

    变量lines的类型是Stream<String>

    变量warningCount的类型是long

    也就是说,如果给这些变量赋予不同值则会失败。比如,像下面这样的二次赋值会造成编译错误:

局部变量类型

    然而还有一些关于类型推断的小问题;如果类Car和Bike都是Vehicle的子类,然后声明

局部变量类型

    这里声明的v的类型是Car还是Vehicle?这种情况下很好解释,因为初始化器(这里是Car)的类型非常明确。如果没有初始化器,就不能使用var。稍后像这样赋值会出错。

局部变量类型

    换句话说,var并不能完美地应用于多态代码。

    那应该在哪里使用局部变量类型推断呢?

    什么情况下局部类型推断会失效?你不能在字段和方法签名中使用它。它只能用于局部变量,比如下面的代码是不正确的:

局部变量类型

    不能在不明确初始化变量的情况下使用var声明局部变量。也就是说,不能使用var语法声明一个没有赋值的变量。下面这段代码

    局部变量类型

    这会产生编译错误:

局部变量类型

    也不能把var声明的变量初始化为null。实事上,在后期初始化之前它究竟是什么类型,这并不清楚。

局部变量类型

    不能在Lambda表达式中使用var,因为它需要明确的目标类型。下面的赋值就是错的:

局部变量类型

    但是,下面的赋值却是有效的,原因是等式右边确实有一个明确的初始化。

局部变量类型

    这个列表的静态类型是什么?变量的类型被推导为ArrayList<Object>,这完全失去了泛型的意义,所以你可能会想避免这种情况。

    以上就是开课吧广场小编整理的“Java10的局部变量类型推断”一文,更多Java教程相关内容尽在开课吧广场Java教程频道!

免责声明:本站所提供的内容均来源于网友提供或网络搜集,由本站编辑整理,仅供个人研究、交流学习使用。如涉及版权问题,请联系本站管理员予以更改或删除。
有用
分享
全部评论快来秀出你的观点
登录 后可发表观点…
发表
暂无评论,快来抢沙发!
高并发编程训练营