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)关注\\我们。

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

  1. Java 8新特性探究(6):泛型的目标类型推断

    简单理解泛型 泛型是Java SE 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数.通俗点将就是"类型的变量".这种类型变量可以用在类.接口和方法 ...

  2. Java中的类型推断和lambda表达式

    文章目录 简介 类型的显示使用 Stream中的类型推断 类型推断中变量名字的重要性 类型推断对性能的影响 类型推断的限制 总结 简介 java是强类型的编程语言,每个java中使用到的变量都需要定义 ...

  3. java中无法推断类型参数_Java 10中的本地类型推断,或者如果它像鸭子一样嘎嘎叫...

    java中无法推断类型参数 最近,Oracle采用了一种新策略,即每六个月发布一次新的语言版本. 该策略假定只有每个第3版都将提供长期支持或LTS. 快速说明: 具有LTS的当前版本是Java 8: ...

  4. Java 10中的本地类型推断,或者如果它像鸭子一样嘎嘎叫

    最近,Oracle采用了一种新策略,即每六个月发布一次新的语言版本. 该策略假定只有每个第3版都将提供长期支持或LTS. 快速说明: 具有LTS的当前版本是Java 8: Java 9仅应在2018年 ...

  5. Java A的新本地变量类型推断

    对于编程语言迷来说,新闻几乎比这更令人兴奋! 现在有一个状态为"候选"的本地变量类型推断的JEP 286 . 以及Brian Goetz的反馈请求,我很想邀请您参加: http : ...

  6. Java 10:局部变量类型推断

    Java 10:局部变量类型推断 在本文中,我们将深入研究Java 10中引入的局部变量类型推断的新特性.我们将讨论使用局部变量类型推断的范围和局限性. 此功能是作为JEP(JDK增强提案)的一部分提 ...

  7. java全局变量和局部变量_Java 10:局部变量类型推断

    java全局变量和局部变量 In this article, we would take a deep dive at the new feature of Local-Variable Type I ...

  8. Java 编程问题:四、类型推断

    原文:Java Coding Problems 协议:CC BY-NC-SA 4.0 贡献者:飞龙 本文来自[ApacheCN Java 译文集],自豪地采用谷歌翻译. 本章包括 21 个涉及 JEP ...

  9. Java SE7新特性之泛型实例创建时的类型推断

    Java SE7新特性之泛型实例创建时的类型推断 标签: JDK7泛型 2014-01-04 15:34 6015人阅读 评论(0) 收藏 举报  分类: Java基础(9)  只要编译器从上下文中能 ...

最新文章

  1. 面向过程(或者叫结构化)分析方法与面向对象分析方法到底区别在哪里?
  2. 文巾解题 1765. 地图中的最高点
  3. flash cs3 代码提示 应该加强
  4. 让2个并列的div根据内容自动保持同等高度js
  5. lua劈分字符串方法及实例
  6. jQuery源码分析系列(31) : Ajax deferred实现
  7. PPDE三星私有协议
  8. 2011年手机应用商店混战局面开始
  9. 基于Radon滤波反投影算法的CT图像重建matlab仿真
  10. 多线程设计模式-主仆模式
  11. 百度工程能力白皮书--对工程能力永无止境的追求
  12. nginx的多域http、https同时访问配置及http重定向https
  13. luogu1378 油滴扩展 (深搜)
  14. 新媒体运营编辑有出路吗
  15. 甘特图:项目进度管理中的跟踪工具
  16. tp6+容联发送短信
  17. 扰人的异常:net.sf.json.JSONException: Object is null
  18. MATLAB打开nc文件并读取nc文件数据
  19. PTA 统计工龄 思路分析及代码解析
  20. Python3 《零基础小白从入门到实战》之“continue 语句”

热门文章

  1. 常用的几个PHP加密函数
  2. Hadoop集群启动、初体验
  3. 使用Akka持久化——消息发送与接收
  4. 2016OSC源创会年终盛典-架构与数据专场-杨亮
  5. [JavaScript] js 判断闰年
  6. Redis中的管道有什么用?
  7. Gdevops广州站:大咖齐聚,从事运维和数据库的你不能错过!
  8. 包装类 与 简单集合框架
  9. java 管理后台前台分离_系统前台后台是否应该分离(包括部署)
  10. Linux中7个判断文件系统类型的方法