本文由 ImportNew - 彭秦进 翻译自 javacodegeeks。如需转载本文,请先参见文章末尾处的转载要求。

ImportNew注:如果你也对Java技术翻译分享感兴趣,欢迎加入我们的 Java开发 小组。参与方式请查看小组简介。

在浏览Java8的特性列表的时候,目标类型推断这个特别有趣的、鲜为人知的特性一下子吸引了我。Java语言的设计者通过它让我们减轻了一些使用泛型时(Java5-7)的痛苦。让我们来看看过去泛型使用的示例:

class List {

static List nil() {..}

static List cons(Z head, List tail) {..}

E head() {..}

} 在上述例子,在

JEP:101中声称可以用下面的方法更好地表示:

// 建议写法:

List.cons(42, List.nil());

String s = List.nil().head();

// 不推荐的写法:

List.cons(42, List.nil());

String s = List.nil().head() 作为一个

熟练的API设计师,在Java路线图中看到示例中的进步着实令人激动。这些令人兴奋的变化究竟包含了什么?让我来更加详细地说明:

// 通过赋值语句推断泛型的类型

List l = List.nil();

// 更好的办法是让编译器从函数的参数类型中直接推断

List.cons(42, List.nil());

// 或者从“链式调用”中推断

String s = List.nil().head(); 因此在上面的链式方法调用中,会延迟到整个赋值表达式完成时才进行类型推断。通过赋值语句左边,编译器会为head()调用推断;为String。然后,再次推断nil()调用的为String。 在我看来这真的很神奇。 对nil()方法的AST计算会延迟到“关联”子节点计算时才最后完成。这是一个很棒的主意,不是吗?

是的,确实很棒!

你可能也会这么认为。因为一组流畅的API,像 jooq 或 Stream API在设计时会考虑到这种调用的流畅性,在链式调用的最后才进行类型推断。为此,我下载了最新的JDK 8评估版本测试下面的程序:

public class InferenceTest {

public static void main(String[] args) {

List ls = List.nil();

List.cons(42, List.nil());

String s = List.nil().head();

}

} 以下是得到的编译结果:

C:\Users\Lukas\java8>javac InferenceTest.java

InferenceTest.java:5: error: incompatible types:

Object cannot be converted to String

String s = List.nil().head();

^

1 error 从结果中可以看到,基于该方法参数的类型推断已经实现了(因此编译通过了),但是链式方法调用中的类型推断还没有实现。我在网上搜索到了一个解释,从

Stack OverFlow 问题链接到

lambda-dev开发者邮件列表中。

看来,Java类型系统已经变得相当复杂。由于太过复杂,要实现这种疯狂的类型推断变得不太现实。但是,每天编写Java 8代码的时候,即使略有改善也有重大的价值。

最后,希望在Java 9中会有val和 var 这样的关键字,与其他语言一样。

原文链接:

javacodegeeks 翻译:

ImportNew.com -

彭秦进

译文链接:

http://www.importnew.com/8301.html

[

转载请保留原文出处、译者和译文链接。]

java8类型推导,鲜为人知的Java8特性:泛化目标类型推断相关推荐

  1. java8类型推导,鲜为人知的Java8特性:泛化目标类型推断,java8泛化

    鲜为人知的Java8特性:泛化目标类型推断,java8泛化 在浏览Java8的特性列表的时候,目标类型推断这个特别有趣的.鲜为人知的特性一下子吸引了我.Java语言的设计者通过它让我们减轻了一些使用泛 ...

  2. 深入理解Java 8 Lambda(语言篇——lambda,方法引用,目标类型和默认方法)

    作者:Lucida 微博:@peng_gong 豆瓣:@figure9 原文链接:http://zh.lucida.me/blog/java-8-lambdas-insideout-language- ...

  3. [转]深入理解Java 8 Lambda(语言篇——lambda,方法引用,目标类型和默认方法)...

    以下内容转自: 作者:Lucida 微博:@peng_gong 豆瓣:@figure9 原文链接:http://zh.lucida.me/blog/java-8-lambdas-insideout-l ...

  4. Java Lambda(语言篇——lambda,方法引用,目标类型,默认方法,函数接口,变量捕获)

    深入理解Java 8 Lambda(语言篇--lambda,方法引用,目标类型和默认方法) 原文链接:http://zh.lucida.me/blog/java-8-lambdas-insideout ...

  5. Effective Modern C++翻译(3)-条款2:明白auto类型推导

    条款2 明白auto类型推导 如果你已经读完了条款1中有关模板类型推导的内容,那么你几乎已经知道了所有关于auto类型推导的事情,因为除了一个古怪的例外,auto的类型推导规则和模板的类型推导规则是一 ...

  6. 《Effective Modern C++》翻译--条款2: 理解auto自动类型推导

    条款2: 理解auto自动类型推导 如果你已经读过条款1关于模板类型推导的内容,那么你几乎已经知道了关于auto类型推导的全部.至于为什么auto类型推导就是模板类型推导只有一个地方感到好奇.那是什么 ...

  7. 聊聊 Java8 以后各个版本的新特性

    [这是 ZY 第 11 篇原创技术文章] 某天在网上闲逛,突然看到有篇介绍 Java 11 新特性的文章,顿时心里一惊,毕竟我对于 Java 的版本认识还停留在 Java 8 上,而日常使用的语法和 ...

  8. Java13都要来了,你还不了解Java8的新(旧)特性?

    Java如今的版本迭代速度简直不要太快,一不留神,就错过了好几个版本了.官方版本虽然已经更新到Java12了,但是就目前来说,大多数Java系统还是运行在Java8上的,剩下一部分历史遗留系统还跑在J ...

  9. c++ 14新的语法特性之返回类型推导

    c++ 14新的语法特性之返回类型推导 一.返回类型推导 返回类型推导 即编译器会在运行期间,推导出该函数方法的返回类型,不过应该也会存在问题,比如返回类型不同的时候,所以这个特性 还是谨慎使用比较好 ...

最新文章

  1. LR常见的报错处理方法
  2. swoole单台并发php,php swoole 并发多少?
  3. 【概率论与数理统计】假设检验
  4. 隐私计算--差分隐私
  5. web.xml隐藏html,web.xml
  6. linux内核中用来对共享资源进行隔离,简单理解Docker
  7. springboot redis shiro 实现 单点登录
  8. c++远征之模板篇——静态数据成员,静态成员函数
  9. matlab 计算 工程,matlab工程计算.doc
  10. panel垂直滚动条占用宽度_南开区垂直车库门车库门安装价格
  11. 图解一致性哈希算法,看这文就够了!
  12. Android源码学习之浅析SystemServer脉络
  13. 用Redis实现分布式锁 与 实现任务队列
  14. PHP如果某商品下的所有货品库存都为0,则下架该商品
  15. go语言介绍及应用场景分析
  16. 强哥日常高效工作流骨灰级玩家培训课程
  17. HDFS数据加密空间--Encryption zone
  18. Cadence仿真笔记(二):传统noise仿真—共源极的噪声
  19. P1930 亚瑟王的宫殿
  20. 计算机软件水平考试什么题型,计算机软考考什么内容

热门文章

  1. FH8626V100添加Uboot串口
  2. linux arm 地址映射 ioremap_nocache 使用,ioremap_nocache 函数分析
  3. python获取软件窗口的坐标
  4. 黑马程序员Java零基础视频教程(2022最新Java)B站视频学习笔记-Day12-学生管理系统
  5. 一条命令CentOS配置IP CentOS配置静态IP
  6. java 相似度计算
  7. 360安全浏览器错误页面广告屏蔽教程
  8. 深入浅出SSD笔记 第1章 SSD综述
  9. Word处理控件Aspose.Words功能演示:在 Python 中将 TXT 文件转换为 PDF
  10. 5.4.1 停止等待协议