遍历Java 8功能列表 , 广义目标类型推断使我震惊,因为它是一个特别有趣,鲜为人知的瑰宝。 看起来Java语言设计人员将减轻过去使用泛型(Java 5-7)时遇到的某些痛苦。 让我们看看他们的例子:

class List<E> {static <Z> List<Z> nil() {..}static <Z> List<Z> cons(Z head, List<Z> tail) {..}E head() {..}
}

给定以上示例,JEP 101功能声称能够编写以下代码会很好:

// This:
List.cons(42, List.nil());
String s = List.nil().head();// ... instead of this:
List.cons(42, List.<Integer>nil());
String s = List.<String>nil().head();

我自己是一名流利的API设计人员 ,我很高兴看到这样的改进正在路线图上,尤其是后者。 这些变化有什么激动人心的? 让我更详细地评论一下:

// In addition to inferring generic types from
// assignments
List<String> l = List.nil();// ... it would be nice for the compiler to be able
// to infer types from method argument types
List.cons(42, List.nil());// ... or from "subsequent" method calls
String s = List.nil().head();

因此,在方法被链接的最后一个示例中,类型推断将被延迟,直到整个赋值表达式都已求值。 从赋值的左侧,编译器可以推断<Z>绑定到head()调用上的String 。 然后可以再次使用此信息来推断<Z>nil()调用中再次绑定到String

对我来说,这听起来像是很麻烦的事,因为需要延迟nil()调用的AST评估,直到评估“依赖”子AST为止。 这是一个好主意吗?

是的,这太棒了!

……你可能会想。 因为可以使用更加流畅的样式来设计流畅的API,例如jOOQ或Streams API,所以将类型推断推迟到调用链的末尾。

因此,我下载了JDK 8的最新评估版,以使用以下程序对此进行测试:

public class InferenceTest {public static void main(String[] args) {List<String> 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 StringString s = List.nil().head();^
1 error

因此,实现了基于方法参数类型的类型推断(并因此进行了编译),但没有实现链式方法调用的类型推断。 我在互联网上搜索了一个解释,发现此Stack Overflow问题链接到了lambda-dev邮件列表上的这个有趣的线程 。

看来Java类型系统已经变得相当复杂。 太复杂,无法实现这种疯狂的类型推断。 但是,仍然需要进行一些细微的改进,这在每天编写Java 8代码时将非常有价值。

也许在Java 9中,我们将像其他所有人一样获得valvar

参考: 鲜为人知的Java 8功能:来自我们的JCG合作伙伴 Lukas Eder在JAVA,SQL和JOOQ博客上的广义目标类型推断 。

翻译自: https://www.javacodegeeks.com/2013/11/a-lesser-known-java-8-feature-generalized-target-type-inference.html

鲜为人知的Java 8功能:广义目标类型推断相关推荐

  1. java 鲜为人知的知识点_鲜为人知的Java 8功能:广义目标类型推断

    java 鲜为人知的知识点 遍历Java 8的功能列表 , 广义目标类型推断使我震惊,因为它是一个特别有趣,鲜为人知的瑰宝. 看起来Java语言设计人员将减轻过去使用泛型(Java 5-7)时遇到的某 ...

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

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

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

    本文由 ImportNew - 彭秦进 翻译自 javacodegeeks.如需转载本文,请先参见文章末尾处的转载要求. ImportNew注:如果你也对Java技术翻译分享感兴趣,欢迎加入我们的 J ...

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

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

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

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

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

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

  7. 根据变量推断变量类型_11位专家参与其中:本地变量类型推断是Java 10中最大的新功能

    根据变量推断变量类型 " Java 10不仅是对Java 9的简单稳定性和性能修复," 尽管Java 9是六个月前才发布的( 仅! ),这意味着对Java 10的期望可能不是很高, ...

  8. java多功能钟_Java 11将包含更多功能

    java多功能钟 Java 11即将发布的功能是什么?它与Java 9和10有何不同? Java 10可能是新手,但现在该谈论Java 11了.Oracle迈向更快的发布周期意味着更多的特性和功能以比 ...

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

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

最新文章

  1. 第八周项目四-角色有多样武器
  2. P3809【模板】后缀排序
  3. 音游android平板,音游专题 - 有时候听歌远远不够,试试这些音游吧 - Android 应用 - 【最美应用】...
  4. 在Android中调用KSOAP2库访问webservice服务出现的服务端传入参数为null的问题解决
  5. ffmpeg和SDL教程 04:创建线程
  6. 如何在Python中将元素添加到列表
  7. (软考高级、高项)信息系统项目管理师(第三版)过关经验
  8. Java web网页版仿QQ实现在线聊天功能系统
  9. 【LOJ#10064】黑暗城堡
  10. CSMA/CD协议详解!!!
  11. iOS开发:图标生成器Prepo 的使用,讲的明明白白
  12. List的toArray方法强制转换
  13. 每年技术研究方向一览
  14. 1588的E2E链路延迟测量机制
  15. 企业信息化建设中微服务架构选择的必要性
  16. 设计模式——Facade
  17. 超出ipc连接数范围_NVR添加不上IPC,咋整?---大华篇
  18. java11 使用ParameterizedTypeImpl 程序包sun.reflect.generics.reflectiveObjects不存在 maven编译失败
  19. SAF.NET_0.5.0.9 发布
  20. pytorch对函数求偏导

热门文章

  1. ssm执行linux 指令,Linux逻辑卷快照及ssm的使用
  2. 反引号包裹反引号_五个金色反引号
  3. jdk8 string::_JDK 12的String :: transform方法的简要但复杂的历史
  4. openhub_OpenHub框架–下一个有趣的功能
  5. hadoop lambda_Delta架构:统一Lambda架构并利用Hadoop / REST中的Storm
  6. 如何在Java中使用Zxing和JFreeSVG创建QR Code SVG?
  7. 使用Spring Boot 2通过OAuth2和JWT进行集中授权
  8. 在JDK 12精简数字格式中使用最小分数数字
  9. 使用Spring Boot,JHipster和React构建照片库PWA
  10. adf4350配置_配置MySQL以进行ADF开发