java 鲜为人知的知识点

遍历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 鲜为人知的知识点

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

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

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

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

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

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

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

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

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

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

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

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

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

  7. java重要基础知识点_必看 | 新人必看的Java基础知识点大梳理

    原标题:必看 | 新人必看的Java基础知识点大梳理 各位正在认真苦学Java的准大神,在这烈日炎炎的夏季里,老九君准备给大家带来一个超级大的"冰镇西瓜,"给大家清凉一下,压压惊. ...

  8. 新手学java 学哪方面_初学者学Java应从哪些方面学习?

    原标题:初学者学Java应从哪些方面学习? Java作为应用于网络的最好语言,前景无限看好.然而,就算用Java建造一个不是很烦琐的web应用,也不是件轻松的事情.那么,初学者学Java应从哪些方面学 ...

  9. java获取机器号_(转)JAVA获得机器码的实现

    http://yangshangchuan.iteye.com/blog/2012401 首先,定义了一个统一的接口,以支持不同操作系统不同实现的透明切换: Java代码  收藏代码 /** *生成机 ...

最新文章

  1. 排名前 16 的 Java 工具类
  2. BZOJ - 3631 松鼠的新家 (树链剖分)
  3. c++ cuda拷贝内存
  4. 假如我结婚以后父母把房子过户到我一人名下,属于夫妻共同财产嘛?
  5. Linux环境SOCKET编程1:套接字
  6. Python ConfigParser
  7. 如何打出好看的数学公式呢?
  8. linux的常用的安装命令
  9. 快递物流配货发货系统学习--以京东物流为例
  10. 计算机色温调整,电脑色温如何调节
  11. WIN10任务栏卡死,鼠标一直转圈(亲测有效)
  12. 光明区支持先进制造业高质量发展若干措施(征求意见稿)
  13. 再见李佳奇,菜鸟哥用Python也能帮小姐姐选择口红啦!
  14. 2021-5-11 atcoder C - Replacing Integer
  15. SSL证书的根证书和中间根证书的区别
  16. 思科《计算机网络》期末考试答案A卷
  17. 数据稀疏or特征稀疏
  18. c语言 位运算和位运算符
  19. 2021年R1快开门式压力容器操作考试技巧及R1快开门式压力容器操作证考试
  20. jQuery on(绑定事件)前别忘了off(移除事件)

热门文章

  1. 【线段树】Frog Traveler(CF751D)
  2. 【决策单调性】玩具装箱(金牌导航 决策单调性优化DP-1)
  3. 19、mysql中定时器的创建和使用
  4. Spark SQL(三)之视图与执行SQL
  5. Zookeeper面试题
  6. 利用JEXL实现动态表达式编译
  7. 彻底理解正向代理和反向代理
  8. Vue及React脚手架安装
  9. Layui hint: Table element property lay-data configuration item has a syntax error解决方式
  10. 使用枚举定义常量更好点儿