鲜为人知的Java 8功能:广义目标类型推断
遍历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中,我们将像其他所有人一样获得val
和var
!
翻译自: https://www.javacodegeeks.com/2013/11/a-lesser-known-java-8-feature-generalized-target-type-inference.html
鲜为人知的Java 8功能:广义目标类型推断相关推荐
- java 鲜为人知的知识点_鲜为人知的Java 8功能:广义目标类型推断
java 鲜为人知的知识点 遍历Java 8的功能列表 , 广义目标类型推断使我震惊,因为它是一个特别有趣,鲜为人知的瑰宝. 看起来Java语言设计人员将减轻过去使用泛型(Java 5-7)时遇到的某 ...
- java8类型推导,鲜为人知的Java8特性:泛化目标类型推断,java8泛化
鲜为人知的Java8特性:泛化目标类型推断,java8泛化 在浏览Java8的特性列表的时候,目标类型推断这个特别有趣的.鲜为人知的特性一下子吸引了我.Java语言的设计者通过它让我们减轻了一些使用泛 ...
- java8类型推导,鲜为人知的Java8特性:泛化目标类型推断
本文由 ImportNew - 彭秦进 翻译自 javacodegeeks.如需转载本文,请先参见文章末尾处的转载要求. ImportNew注:如果你也对Java技术翻译分享感兴趣,欢迎加入我们的 J ...
- Java 8新特性探究(6):泛型的目标类型推断
简单理解泛型 泛型是Java SE 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数.通俗点将就是"类型的变量".这种类型变量可以用在类.接口和方法 ...
- Java 10中的本地类型推断,或者如果它像鸭子一样嘎嘎叫
最近,Oracle采用了一种新策略,即每六个月发布一次新的语言版本. 该策略假定只有每个第3版都将提供长期支持或LTS. 快速说明: 具有LTS的当前版本是Java 8: Java 9仅应在2018年 ...
- Java A的新本地变量类型推断
对于编程语言迷来说,新闻几乎比这更令人兴奋! 现在有一个状态为"候选"的本地变量类型推断的JEP 286 . 以及Brian Goetz的反馈请求,我很想邀请您参加: http : ...
- 根据变量推断变量类型_11位专家参与其中:本地变量类型推断是Java 10中最大的新功能
根据变量推断变量类型 " Java 10不仅是对Java 9的简单稳定性和性能修复," 尽管Java 9是六个月前才发布的( 仅! ),这意味着对Java 10的期望可能不是很高, ...
- java多功能钟_Java 11将包含更多功能
java多功能钟 Java 11即将发布的功能是什么?它与Java 9和10有何不同? Java 10可能是新手,但现在该谈论Java 11了.Oracle迈向更快的发布周期意味着更多的特性和功能以比 ...
- java中无法推断类型参数_Java 10中的本地类型推断,或者如果它像鸭子一样嘎嘎叫...
java中无法推断类型参数 最近,Oracle采用了一种新策略,即每六个月发布一次新的语言版本. 该策略假定只有每个第3版都将提供长期支持或LTS. 快速说明: 具有LTS的当前版本是Java 8: ...
最新文章
- 第八周项目四-角色有多样武器
- P3809【模板】后缀排序
- 音游android平板,音游专题 - 有时候听歌远远不够,试试这些音游吧 - Android 应用 - 【最美应用】...
- 在Android中调用KSOAP2库访问webservice服务出现的服务端传入参数为null的问题解决
- ffmpeg和SDL教程 04:创建线程
- 如何在Python中将元素添加到列表
- (软考高级、高项)信息系统项目管理师(第三版)过关经验
- Java web网页版仿QQ实现在线聊天功能系统
- 【LOJ#10064】黑暗城堡
- CSMA/CD协议详解!!!
- iOS开发:图标生成器Prepo 的使用,讲的明明白白
- List的toArray方法强制转换
- 每年技术研究方向一览
- 1588的E2E链路延迟测量机制
- 企业信息化建设中微服务架构选择的必要性
- 设计模式——Facade
- 超出ipc连接数范围_NVR添加不上IPC,咋整?---大华篇
- java11 使用ParameterizedTypeImpl 程序包sun.reflect.generics.reflectiveObjects不存在 maven编译失败
- SAF.NET_0.5.0.9 发布
- pytorch对函数求偏导
热门文章
- ssm执行linux 指令,Linux逻辑卷快照及ssm的使用
- 反引号包裹反引号_五个金色反引号
- jdk8 string::_JDK 12的String :: transform方法的简要但复杂的历史
- openhub_OpenHub框架–下一个有趣的功能
- hadoop lambda_Delta架构:统一Lambda架构并利用Hadoop / REST中的Storm
- 如何在Java中使用Zxing和JFreeSVG创建QR Code SVG?
- 使用Spring Boot 2通过OAuth2和JWT进行集中授权
- 在JDK 12精简数字格式中使用最小分数数字
- 使用Spring Boot,JHipster和React构建照片库PWA
- adf4350配置_配置MySQL以进行ADF开发