速来报名!AICon北京站鸿蒙专场~ 了解详情
写点什么

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

  • 2017-01-02
  • 本文字数:2060 字

    阅读完需:约 7 分钟

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<K, V>, type
// inferred for keys will be Set<K>
final var MAX_COUNT = 100L; // MAX_COUNT will be immutable long

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

复制代码
List<String> list = new LinkedList<>(); // type not indicated in
// initialisation, but inferred
// from variable declaration
var list = new LinkedList<>(); // error, impossible to infer a type for
// the contents of the list
Function<String, Integer> f = s -> s.length(); // type of s and length
// inferred from
// declaration
var f = s -> 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<Integer, Integer> intFunction = Integer::valueOf;
// Use Integer.valueOf(String)
Function<String, Integer> 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) -> s.length(); // could infer type
// Function<String, Integer>

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

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


感谢冬雨对本文的审校。

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

2017-01-02 18:005667
用户头像

发布了 33 篇内容, 共 11.3 次阅读, 收获喜欢 10 次。

关注

评论

发布
暂无评论
发现更多内容

开源字节 同城信息小程序

源字节1号

开源 软件开发 前端开发 后端开发 小程序开发

EndNote 20 for Mac(文献管理软件)

背包客

macos Mac软件 EndNote20 endnote EndNote for Mac

软件测试|MySQL安装最全教程

霍格沃兹测试开发学社

迈向先进治理与运营范式|2023开放原子全球开源峰会开源社区治理与运营分论坛圆满收官

开放原子开源基金会

开源 开放原子全球开源峰会 开放原子 开源社区治理与运营

接口测试|HttpRunner模拟发送GET请求&自动生成测试报告

霍格沃兹测试开发学社

HttpRunner

2023年苏州市等级保护测评公司有哪些?分别叫什么名字?

行云管家

等级保护 等保测评 苏州

软件测试|f-string格式化输出的这些用法,90%的Pythoner不知道

霍格沃兹测试开发学社

接口测试|HttpRunner简介及安装

霍格沃兹测试开发学社

HttpRunner

建议程序员人手一份,GitHub免费开源阿里巴巴分布式核心原理

小小怪下士

Java 程序员 分布式

提示工程:从人机交互视角解读

博文视点Broadview

Final Cut Pro for Mac(fcpx专业视频剪辑工具)

背包客

macos FCPX软件 fcpx Mac视频剪辑软件 Final Cut Pro

LED开关电源里的PCB回路设计应该怎么做?

华秋PCB

电路 PCB LED PCB设计 开关电源

java中的线程模型和线程池

demo123567

Java 线程 线程池

数仓架构“瘦身”,Hologres 5000CU时免费试用

阿里云大数据AI技术

数据库 大数据 企业号 6 月 PK 榜

REST 约束:以用户为中心的设计思路

Apifox

程序员 开发 Rest REST API RESTful API

喜讯丨和鲸科技获第七届杨浦“创业之星”大赛创业新锐奖

ModelWhale

Nautilus Chain测试网迎阶段性里程碑,模块化区块链拉开新序幕

威廉META

一键部署通义千问预体验丨阿里云云原生 5 月动态

阿里巴巴云原生

阿里云 云原生

软件测试/测试开发丨Python 内置库 json、正则表达式 re

测试人

Python json 程序员 软件测试

App Cleaner & Uninstaller Pro for Mac(Mac电脑应用程序卸载清理助手) 中文

背包客

macos Mac软件 MacBook Pro Mac清理软件 Mac卸载软件

开源数据库迎来拐点|2023开放原子全球开源峰会数据库分论坛成功召开

开放原子开源基金会

数据库 开源 开放原子全球开源峰会 开放原子

【有奖体验】叮!你有一张 3D 卡通头像请查收

阿里巴巴云原生

阿里云 Serverless 云原生

单元测试|Unittest setup前置初始化和teardown后置操作

霍格沃兹测试开发学社

百度智能云技术委员会主席王耀受邀担任 QCon 联席主席并将发表主题演讲

Baidu AICLOUD

如何学习Java“高并发”,并在项目中实际应用?

程序员小毕

程序员 面试 Java并发 多线程 高并发

2023北京智源大会亮点回顾 | 高性能计算、深度学习和大模型:打造通用人工智能AGI的金三角

GPU算力

inBuilder今日分享丨Object-C消息转发与发送机制

inBuilder低代码平台

杭州云管平台企业有哪些?购买云管平台选择哪家好?

行云管家

云计算 云管平台 云管理 云管

AntDB数据库荣获2023年中国信创产业拳头奖“2023年中国信创数据库卓越品牌”

亚信AntDB数据库

数据库 AntDB AntDB数据库

Java类型推断将不再支持可变性规范_Java_Abraham Marín Pérez_InfoQ精选文章