本文由 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. mixin network_基于Mixin Network的Ruby比特币开发教程
  2. iOS开发 - OC - block的详解 - 基础篇
  3. mysql优化的几种方法_详解mysql数据库不同类型sql语句优化方法
  4. Flutter web问题:Failed to load network image
  5. [031] 实战:书大师网站开发准备
  6. 使用可视化工具redisclient连接redis
  7. 修改mysql数据库字符集_修改及查看mysql数据库的字符集
  8. 2014年高级计算机操作员工种代码36-323不可积分入户深圳吗,2014年深圳积分入户工种加分考证...
  9. maven依赖avro_Apache Avro使用入门指南
  10. Flutter修仙传第一章:从Form入手学会组件使用
  11. Linux C基础笔记(3)
  12. Linux:shell变量功能和Bash shell的操作环境
  13. 两款个人知识库管理软件下载
  14. 第三代航空轴承钢产品 css-42l,航空轴承钢的发展及热处理技术(一)
  15. Pandas DataFrame 使用技巧
  16. Banana Pi 消息
  17. 从内网windows2008服务器复制文件到本地慢,Windows Server 2008网上邻居打开慢的解决...
  18. 怎么下载网页上的视频(you-get)
  19. 7、统计字母、空格、数字 与 其它字符的个数
  20. 萌新面试经,赶紧来看看!

热门文章

  1. Vue实现全局异常处理的几种方案
  2. Vue-cli安装问题及解决方案
  3. C# 操作Cookies
  4. 夏季国内10大避暑胜地指南|7、8、9月暑期最适合旅行目的地
  5. C++实现快速排序法
  6. Flutter 学习之旅 之 flutter 工程目录文件夹说明,以及几个简单 Flutter 案例
  7. 并非从0开始的c++之旅 day1
  8. android实现相机功能,Android开发实现拍照功能的方法实例解析
  9. 巧妙解决appleid问题答案忘了的问题
  10. 关于数据库缓存的各种问题及其解决方法