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

JEP 286 提议在 Java 局部变量中引入类型推断

  • 2016-03-16
  • 本文字数:1864 字

    阅读完需:约 6 分钟

介绍 JEP 286 的提议已经发送到 JEP 讨论平台(platform-jep-discuss)邮件列表中,如果能够实现,将在 Java 局部变量中引入类型推断。由于这只是一个初期阶段的提议,因此并没有计划在 Java 哪个版本中实现,甚至可能不会实现。

类型推断是指声明一个变量但无需指定其相关联的类型。类型推断在 Java 中已经存在一段时间;Java 5 中引入泛型时,便是利用类型推断处理泛型方法。Java 7 中增加了钻石(diamond)运算符 <>(Coin 项目中的一部分)允许 List 类型的变量被初始化而不需要 ArrayList<> 类型的约束。最近,Java 8 中增加了 lambdas 和 streams 功能,可以在方法链中推断类型以及 lambda 参数的形参类型。通常可以从上下文或初始化程序的表达式中推断出类型的信息。类似地如果表达式是无类型的 (如 0 或 null) 则不一定会得到正确的类型推断。类型推断相关内容甚至占据了 Java 语言规范整个第18 章

因为类型推断早已经被支持,并且可以有效地推断final 局部变量,设想它被用于Java 局部变量并不是一个大难题。它仅用于局部变量(这些变量通过方法或lambda 函数体定义)而不是方法签名或字段签名。

提议中对于声明推断类型的变量提供了一个类关键字var。在支持类型推断的语言中,通常把类型放在变量名的后面,这样一个变量或参数可以定义为aNumber:Int 或者aNumber,有效地将类型的定义(:Int)作为可选的后缀。但是,Java 是基于C 语言,把类型放在第一位,而且这几乎是不可改变的。这样类关键字var 被用来当作占位符代表“任何类型”,类似于其他语言中变量的定义方式。因此,它有可能写出这样的语句:

var proposal = "JEP-286";这种情况下,变量的类型将被推断为字符串,表达式的实际类型在另一边。这也将简化泛型数据结构,例如:

var phonebook = new HashMap<string>()</string>值得注意的是,这种类型会被推断为实际的类型;这种情况下,应该优先使用接口来代替。然而在大多数情况下鉴于它仅适用于局部变量,这种差别并不是特别有意义的。

也有人提出问题,是否其他类关键字结构也可能是有用的,例如为只读变量提供不同的结构。虽然 final var 可以拿来使用(对于 final 的有效推断已经比较成熟,也许没有必要使用其他类关键字结构),但是是否还有其他的可能性,这个灵感来自其他语言,如 const,val 或 let。对于变量的声明也会有其他的可能,例如 auto。JEP 提议者请求大家给予反馈。有一项调查来征求大家的意见,这样是很有用的。

建议方案的实施不是使 var(或 auto/let/def/val …)成为一个新的关键字,这将会导致已经使用它们作为标识符的 Java 程序作废。相反,他们会保留这些类型名称,像 Object 或 String 一样有效。用 var 作为现有类型(class 或 interface)的应用程序将被中断,但这将打破现有的 java 命名规则。

通过原型实现和扫描现有 JDK 源代码,结果显示大多数情况下,局部变量切换为使用 var 是没有问题的。少数情况下不能成功地推断出结果,或者是因为没有初始化值,初始化为 null(当然可以是任何类型) 或者是因为推断出了比指定类型更严格的类型 (例如指定类型为 List,推断结果却是 ArrayList)。这确实表明,这个想法在实践中是可行的,在大多数情况下是有用的。

在 JDK 源代码下运行原型,结果如下:

  • 83.5% 推断出在源代码中存在的准确类型
  • 4% 推断出另一个可表示的类型(通常是更精准的类型)
  • 0% 由于推断的类型不可表示被拒绝
  • 8.5% 由于没有初始化被拒绝
  • 3% 由于初始化值为 null 被拒绝
  • 0.5% 由于需要一个目标类型被拒绝

如果我们排除由于没有初始化或初始化结果为 null 而被拒绝的案例,我们可以发现超过 99% 的局部变量可以被推断,95% 可以推断出正确的结果。

有效的 final 局部变量 (所有局部变量的 77%):

  • 86% 推断出在源代码中存在的准确类型
  • 4% 推断出另一个可表示的类型式(通常是更精准的类型)
  • 0% 由于推断的类型不可表示被拒绝
  • 8% 由于没有初始化被拒绝
  • 0.5% 由于初始化值为 null 被拒绝
  • 0.5% 由于需要一个目标类型被拒绝

提议中把这部分内容加入 Java 语言未来版本中,将会在 JEP 286 旗帜下进行讨论;如果有任何意见,请与 2016 年 3 月 16 日调查问卷关闭之前填写问卷信息反馈给Java 团队。

查看英文原文: JEP 286 Proposes Extending Type Inference to Local Variables in Java


感谢张龙对本文的审校。

给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ @丁晓昀),微信(微信号: InfoQChina )关注我们,并与我们的编辑和其他读者朋友交流(欢迎加入 InfoQ 读者交流群InfoQ 好读者(已满),InfoQ 读者交流群(#2)InfoQ 好读者)。

2016-03-16 19:001790
用户头像

发布了 31 篇内容, 共 10.1 次阅读, 收获喜欢 0 次。

关注

评论

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

基于场景文字的多模态融合的图像分类

华为云开发者联盟

计算机视觉 图像分类 场景文本 图像视觉 多模态融合分析

为什么 Rust 是 Stack Overflow 最受欢迎语言?

非凸科技

c++ rust 性能 Stack Overflow 内存安全

小程序自动化测试框架原理剖析

百度Geek说

小程序 百度

架构实战营 - 方案设计文档模板

华仔

架构实战营 文档模板 方案设计

作为一名iOS开发者—面对音视频这个新风口应该怎样学习才能乘风而起?

iOSer

ios 音视频 ios开发 OpenGL ES 音视频技术

IOS技术分享| ARCallPlus 开源项目(二)

anyRTC开发者

ios 开源 音视频 移动开发 呼叫邀请

好的每日站会,应该这么开 | 敏捷开发落地指南

阿里云云效

云计算 阿里云 敏捷开发 研发敏捷 每日站会

TiFlash 源码阅读(一) TiFlash 存储层概览

PingCAP

头一次见这么牛的的SpringBoot从入门到实战文档

Java架构追梦

Java spring 程序员 后端开发

不要再焦虑了,进大厂真的没你想象的那么困难

Java架构追梦

Java java面试 后端开发

等保2.0国家标准是什么?与等保1.0有啥变化?

行云管家

网络安全 等保 等级保护 等保2.0

netty系列之:protobuf在UDP协议中的使用

程序那些事

Java Netty 程序那些事 4月月更

得物技术浅谈深入浅出的Redis分布式锁

得物技术

redis 分布式 分布式锁 CAP 一致性

面试突击43:lock、tryLock、lockInterruptibly有什么区别?

王磊

Java 面试题

短短6小时,AI设计出40000种毒气分子,很多毒性远超战用神经毒剂

图灵教育

AI

分享一个JDK批量异步任务工具Completion Service,超好用

华为云开发者联盟

jdk 线程 异步 CompletionService 批量异步任务工具

一文掌握 Docker 技术体系

博文视点Broadview

分布式数据对象:超级终端的"全局变量"

科技汇

小微企业如何在10分钟内实现持续交付

阿里云云效

云计算 阿里云 研发管理 持续交付 研发团队

TiDB 查询优化及调优系列(二)TiDB 查询计划简介

PingCAP

Enhanced SWAP内存管理 OpenHarmony构建新的内存管理优化方案——ESWAP

科技汇

稳定性领导者!阿里云获得信通院多项系统稳定性最高级认证

阿里巴巴云原生

阿里云 云原生 可观测 性能压测 获奖

毕业总结

孙强

#架构实战营

深入微服务-SpringCloud调用组件Feign

janyxe

spring Spring Cloud Feign OpenFegin

【IT运维】如何又快又好的进行数据备份?

行云管家

运维 快照 数据备份 IT运维 行云管家

ArkUI框架又有哪些新增能力?

科技汇

java培训MySQL一次性插入多行数据的操作

@零度

Java MySQL

OneFlow获得首届“全国颠覆性技术创新大赛”最高奖

OneFlow

深度学习 技术创新

浅谈小程序开源业务架构建设之路

百度Geek说

无聊科技正经事周刊(第4期):理性囤货与人工智能预测

潘大壮

程序员 科技 行业趋势 科技周刊

10 个 web 在线前端资源,优雅永不过时~

前端 网页设计 在线资源

JEP 286 提议在Java局部变量中引入类型推断_Java_Alex Blewitt_InfoQ精选文章