写点什么

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:006340
用户头像

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

关注

评论

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

海信洗衣机闪耀AWE:三筒品类开创者亮剑,大咖嘉宾连连盛赞

新消费日报

《Operating System Concepts》阅读笔记:p449-p459

codists

操作系统

用 tcpdump 分析 Java 客户端的 prepare 行为

TiDB 社区干货传送门

性能调优 故障排查/诊断

SPC统计过程管理系统(源码+文档+讲解+演示)

深圳亥时科技

【宣法·3.15特辑】电子签怎么跟套路贷混为一谈了?

易成研发中心

电子签名

龙蜥社区第六届理事大会成功举行,共话技术创新与生态合作

OpenAnolis小助手

开源 龙蜥社区 OpenAnolis 龙蜥社区理事大会

SysOM 可观测体系建设(一):万字长文解读低开销、高精度性能剖析工具livetrace

OpenAnolis小助手

AI 可观测性 SysOM 龙蜥系统运维联盟 livetrace

电子签借贷真实吗?315报道引发的行业地震!电子签到底冤不冤?

易成研发中心

《汽车电机MES系统实战指南:打造柔性化智能产线的4大核心模块与3项关键技术突破》​

万界星空科技

mes 制造业工厂 电机MES 汽车电机 汽车电机mes

保姆级离线 TiDB V8+ 解释

TiDB 社区干货传送门

8.x 实践

荣耀时刻!第二届开放原子大赛-OS Copilot 学习赛获奖名单新鲜出炉

OpenAnolis小助手

开源 操作系统 龙蜥社区 龙蜥赛事

今日最新消息!黑龙江网络安全等级保护备案新规定,速看!

黑龙江陆陆信息测评部

这些搜索技巧你不会?

Immerse

数字化转型投入大、见效慢?中小企业该如何应对?

天津汇柏科技有限公司

数字化转型

“官方网站+公开课程”双赋能,鸿蒙游戏开发者服务焕新升级

最新动态

高性能网络SIG双月动态:加速 SMC eBPF 透明替换特性上游化进程,并与上游深度研讨新特性

OpenAnolis小助手

操作系统 龙蜥社区 smc 龙蜥SIG月报

探秘能源行业AI密码:云鼎科技用大模型实现了″四个转变″

Alter

多智能体强化学习的算力调度创新,让每一份算力都创造广告价值 | 京东零售技术实践

京东零售技术

【2月13日 - 3月14日】TiCDC 新架构试用通道正式开启,全新升级,抢先体验,多重参与奖励等你拿!

TiDB 社区干货传送门

高性能存储SIG月度动态:erofs快照器合入containerd社区,ANCK支持virtio-blk直通

OpenAnolis小助手

操作系统 高性能存储 龙蜥社区 龙蜥社区SIG EROFS

5步教你创建大模型自定义插件

阿里技术

大模型 自定义插件 LLM

使用DataWorks Notebook实现智能图片标注,给你的图片加个“注释”

阿里云大数据AI技术

大数据 数据分析 ETL 多模态 Dataworks

深入探究小红书笔记详情页面数据采集接口​

tbapi

小红书笔记详情接口 小红书API

在京东做技术是种什么体验?| 13位零售人告诉你答案

京东零售技术

CST软件如何用天线远场计算Group delay延时

思茂信息

cst CST软件 CST Studio Suite

电子签高利贷实况解读:央视3·15乌龙曝光,电子签行业替高利贷买单

易成研发中心

Karmada v1.13 版本发布!新增应用优先级调度能力

华为云开发者联盟

容器 云原生 集群 Karmada

重塑家庭观影标准,海信激光电视探索X1斩获艾普兰奖

新消费日报

龙蜥 2024 年度“最佳合作伙伴”揭晓!申威、AMD 等多家新晋贡献厂商实力登榜

OpenAnolis小助手

操作系统 龙蜥社区 OpenAnolis 龙蜥社区年度优秀贡献者

TiCDC 新架构 v9.0.0 使用实践

TiDB 社区干货传送门

TiCDC新架构

重识 APO:DeepSeek 掀起可观性领域变革 | 龙蜥生态

OpenAnolis小助手

AI 系统运维 apo 龙蜥生态 DeepSeek

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