Java类型推断将不再支持可变性规范

news/2024/6/30 23:35:56

Java类型推断是一项推荐的Java特性,允许开发人员使用var关键字代替显式的变量类型声明。最近的报道显示,由于社区内无法就区分可变和不可变变量的实现方式达成一致意见,Java类型推断将不再支持使用关键字区分可变的和不可变变量。提议的一些用来表示不可变变量的关键字包括val和let。为了避免对细枝末节的长期讨论,一些这样的例子将被排除以求简洁。尽管JEP并没有透露目标版本,Java 10可能会实现这些功能。

\\

为了完整地定义JEP 286的范围,甲骨文公司的Java语言架构师Brian Goetz在经过了一系列的提议和咨询之后了解到,实现局部变量类型推断(和避免显式声明变量类型的步骤)的新功能已达成足够共识,该功能应该使用关键词var。另外,社区还强调了他们希望使用和其它语言,如Scala、Kotlin或JavaScript,一样的方式来区分可变和不可变变量的类型推理。然而,尽管大家赞同这是一个有用的功能,但是就如何实现该区分,没有一致的意见。var/val、var/let和(raw type)/var都有强烈的支持者和反对者。为了防止这种争论延迟类型推断的进展,该功能的主导者决定将范围缩小到局部变量的简单类型推断,不管可变性区别。尽管如此,使用稍长一点的构造final var,不可变的局部变量的类型仍然是可推断的。

\\
var s = \"hello\"; // type of s is String\var keys = map.keySet(); // assuming map is of type Map\u0026lt;K, V\u0026gt;, type \                         // inferred for keys will be Set\u0026lt;K\u0026gt;\final var MAX_COUNT = 100L; // MAX_COUNT will be immutable long\
\\

更新还用于提醒可推断的程度。一方面,只有初始化信息将用于推断变量的类型;这意味着在声明时未初始化的变量需要显式声明类型,它也有助于防止一些潜在的晦涩的错误(例如,代码深处的变量的类型推断错误)。另一方面,只有局部变量的类型是可推断的,不包括属性和方法,这是基于如下理解的。属性和方法是类的公共接口的一部分,因此需要由程序员明确定义。类型推断不起作用的其他情况是,暗示自身类型的初始化表达式,如:

\\
List\u0026lt;String\u0026gt; list = new LinkedList\u0026lt;\u0026gt;(); // type not indicated in\                                        // initialisation, but inferred\                                        // from variable declaration\var list = new LinkedList\u0026lt;\u0026gt;(); // error, impossible to infer a type for\                               // the contents of the list\\Function\u0026lt;String, Integer\u0026gt; f = s -\u0026gt; s.length(); // type of s and length\                                               // inferred from\                                               // declaration\var f = s -\u0026gt; s.length(); // error, type of s unknown, return type of\                         // length unknown\\int[] array = {1, 2, 3}; // 1, 2, 3 interpreted as integers\var array = {1, 2, 3}; // error, poly expressions not supported\                       // (see below)\\// Use Integer.valueOf(int)\Function\u0026lt;Integer, Integer\u0026gt; intFunction = Integer::valueOf;\\// Use Integer.valueOf(String)\Function\u0026lt;String, Integer\u0026gt; stringFunction = Integer::valueOf; \\// error, ambiguous initialisation\var function = Integer::valueOf; // unable to know which overloaded\                                 // version of valueOf should be used\
\\

目前还不清楚是否将支持上述的某些特定例子。如Goetz所说,“我们将初始化器看作一个独立表达式(standalone expression),通过获取它的类型得到变量的类型。然而,数组初始器与lambda和方法引用一样,是多变表达式(poly expression),所以被拒绝了。”多变表达式是Java 8中随着lambda引进的一个概念,与普通表达式的不同之处在于计算类型的方式。对于普通表达式来说,可以通过在编译时检查表达式的内容获取类型;对于多变表达式,要计算类型,除此之外还需要目标类型(即被表达式赋值的变量的类型)。这意味着,多变表达式已经隐含了一些对自身的类型推断,因此很难甚至不可能推断多变表达式的类型。但是,有一些这类问题的场景似乎提供了足以推断出合适类型的信息,可能将来会考虑把它们纳入进来。如下:

\\
var a = {1, 2, 3}; // could infer type int[]\var f = (String s) -\u0026gt; s.length(); // could infer type\                                  // Function\u0026lt;String, Integer\u0026gt;\
\\

尽管存在局限,局部类型推断能帮助缩小Java和其它JVM语言之间的差距,为Java开发人员减少冗余代码。和lambda现在扩充新功能的方式一样,类型推断可能在第一版之后得到提升。这将确认作为新功能实验场所的JVM语言的非官方动态,最流行的新功能最终被引入Java。

\\

查看英文原文:Java Type Inference Won't Support Mutability Specification

\\

感谢冬雨对本文的审校。

\

给InfoQ中文站投稿或者参与内容翻译工作,请邮件至editors@cn.infoq.com。也欢迎大家通过新浪微博(@InfoQ,@丁晓昀),微信(微信号:InfoQChina)关注\\我们。


http://www.niftyadmin.cn/n/2752661.html

相关文章

Linux下的五种IO模型

引言 本文我们主要了解一下Unix/Linux下5种网络IO模型:blocking IO, nonblocking IO, IO multiplexing, signal driven IO, asynchronous IO以及select/poll/epoll的基本原理,更好的理解在高级语言中的异步编程,但以理解概念为主,…

Elasticsearch、Logstash、Kibana搭建统一日志分析平

ELKstack是Elasticsearch、Logstash、Kibana三个开源软件的组合。目前都在Elastic.co公司名下。 ELK是一套常用的开源日志监控和分析系统,包括一个分布式索引与搜索服务Elasticsearch, 一个管理日志和事件的工具logstash,和一个数据可视化服务…

MySQL嵌套子查询和相关子查询执行过程的区别

详细版本见个人博客:MySQL嵌套子查询和相关子查询执行过程的区别 子查询可以分为 相关子查询 和 嵌套子查询 两类。 一、本文用到的测试数据 假设Books表如下: 类编号图书名出版社价格2c#高级应用圣通出版23.002Jsp开发应用机械出版社45.003高等数学济…

Python中绝对路径的写法

在使用open函数的时候遇到了一些小问题,我是用的是Windows的电脑,目标是使用open()函数打开绝对路径为“E:\pycharm_project\student_info.txt”的文本文档。 我的第一段代码是: open("E:\pycharm_project\studen…

百度编辑器ueditor插入表格没有边框颜色的解决方法

附:如果从word excel 中 复制的表格提交后无边框,参考这个同学的,写的很详细: http://blog.csdn.net/lovelyelfpop/article/details/51678742 最近公司测试的反馈:excel中 复制过来的表格会无边框,上面同…

Python读取指定文件夹中的所有文件的名称生成标签列表

用于机器学习: import os def file_name(file_dir):listName []#for root, dirs, files in os.walk(file_dir):for dir in os.listdir(file_dir):# print(dir) # 当前目录路径listName.append(dir);#print(dirs) # 当前路径下所有子目录# print(files) # 当前路…

tomcat请求跨域问题。

2019独角兽企业重金招聘Python工程师标准>>> 以上情况说明基本跨域问题。正儿八经的是服务器是不应该有跨域请求成功存在的。 为了便于开发,才暂时允许跨域。 现在给出一种我比较熟悉的实例实现后端跨域。 request.setCharacterEncoding("utf-8&quo…

Python截图代码

需求:对大量同尺寸的图片需要裁剪同样区域的图片出来,采用鼠标框选范围。 # 功能:对在当前工程文件夹中的指定路劲的文件中的所有图片进行定点裁剪# 知识点:一张图片需要裁剪出一个矩形的话只需要两个点,左上角和右下角…