鲜为人知的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中,我们将像其他所有人一样获得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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/365657.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

谈谈技术原则,技术学习方法,代码阅读及其它

一、选用技术的原则比较规范的软件开发过程要到有限的几个公司才能学到。偶现在所采用的方法都是圡方法&#xff0c;主程序员&#xff0c;测试驱动&#xff0c;文档和代码写在一起&#xff0c;原型。但基本上坚持几个原则&#xff1a;在工作上以实用为主导&#xff0c;哪个实用…

python下载库报错_下载python中Crypto库报错:ModuleNotFoundError: No module named ‘Crypto’的解决...

前言最近在网上找了很多下载Crypto的方法&#xff0c;感觉作用都不算很大&#xff0c;然后自己瞎搞瞎搞就搞好了&#x1f605;&#xff0c;所以打算分享出来。直接pip下载或者Anaconda下载&#xff0c;Anaconda的话可以直接在官网上下载&#xff0c;pip就不说了&#xff0c;下载…

WPF中元素拖拽的两个实例

WPF中元素拖拽的两个实例 原文:WPF中元素拖拽的两个实例今天结合之前做过的一些拖拽的例子来对这个方面进行一些总结&#xff0c;这里主要用两个例子来说明在WPF中如何使用拖拽进行操作&#xff0c;元素拖拽是一个常见的操作&#xff0c;第一个拖拽的例子是将ListBox中的子元素…

linux重启mysqlsystemctl_解决linux(centos7)重新安装mysql systemctl start mysqld.service时报错...

重新安装mysql时&#xff0c;运行systemctl status mysqld.service报错。[roottest-dcruxue ~]# systemctl start mysqld.serviceJob for mysqld.service failed because the control process exited with error code. See "systemctl status mysqld.service" and &q…

使用vert.x 2.0,RxJava和mongoDB创建simpe RESTful服务

中断了将近半年后发表了一篇新文章。 在本文中&#xff0c;我们将快速了解如何开始使用vert.x&#xff0c;更有趣的是&#xff0c;如何使用RxJava简化异步系统的编程。 我们将涵盖以下主题&#xff1a; 使用Maven创建一个空的vert.x项目 导入IntelliJ并创建一个简单的HTTP服务…

开发进度2

今天主要的精力都是在学习github的基础知识 包括注册安装以及建立一个Git库&#xff0c; 接下来便是菜鸟教程中对github的初步操作详解 注册账户以及创建仓库 要想使用github第一步当然是注册github账号了&#xff0c; github官网地址&#xff1a;https://github.com/。 配置G…

搭建react native所遇到的坑

一、所遇问题 在搭建react native环境中,遇到执行react native run-android命令出现如下问题 1 Could not resolve all dependencies for configuration :classpath. 2 > Could not resolve com.github.dcendents:android-maven-gradle-plugin:3.1.4 3 Required b…

nginx的ngx_http_realip_module模块和http头X-Forwarded-For、X-Real-IP

ngx_http_realip_module模块 realip模块作用&#xff1a;当本机的nginx处于反向代理的后端时可以获取到用户的真实ip。可以让accesslog记录用户真实IP地址。 set_real_ip_from IP1; real_ip_header X-Forwarded-For; real_ip_recursive on; set_real_ip_from —— 设置反向代…

sqlalchemy mysql_使用SQLAlchemy操作MySQL

SQLAlchemy是Python编程语言下的一款开源软件&#xff0c;提供了SQL工具包及对象关系映射(ORM)工具&#xff0c;使用MIT许可证发行。SQLAlchemy首次发行于2006年2月&#xff0c;并迅速地在Python社区中最广泛使用的ORM工具之一&#xff0c;不亚于Django的ORM框架。本文将介绍如…

使用phpstorm+wamp实现php代码实时调试审计

转载自&#xff1a;https://www.bugbank.cn/q/article/5853afaffc0bf4f010ee6ac3.html php调试有N多好用的工具&#xff0c;最近研究到phpstorm配合wamp实现php实时断点调试相当不错&#xff0c;推荐给大家&#xff0c;网上有各种配置版本&#xff0c;但没有一个能好使的。本文…

python处理字符串数组慢_Python字符串处理 - str/bytes

1. strstr.count(sub[, start[, end]])str.encode(encoding"utf-8", errors"strict")str.format(*args, **kwargs) # s "this is from {}".format(__file__)str.find(sub[, start[, end]]) # 没有查找到子串&#xff0c;返回-1str.rfind(sub[, …

如何使用Play框架为https配置SSL证书

我花了数小时试图使它起作用&#xff0c;最后&#xff0c;问题是我自己没有使用keytool生成CSR&#xff08;证书请求&#xff09;。 尝试通过https访问Play时&#xff0c;我一直收到此错误&#xff1a; javax.net.ssl.SSLPeerUnverifiedException&#xff1a;对等方未通过身份…

ERP行业销售如何挖掘潜在客户?

要看不同阶段&#xff0c;小企业发展到一定程度&#xff0c;第一个需求是单体财务系统。因为这个时候财务忙不过来了。在大一点就需要业务系统了&#xff0c;就是生产进销存。有分公司就有集团级软件需求&#xff0c;接着就是oa啊HR啊上下游管理啊等等。接着把握住成本的节省和…

网络隔离主要技术

网络隔离&#xff1a;把两个或者两个以上可路由的网络&#xff08;如&#xff1a;TCP/IP&#xff09;通过不可路由的协议&#xff08;如&#xff1a;IPX/SPX、NetBEUI等&#xff09; 进行数据交换而达到隔离目的。主要原理是使用了不同的协议&#xff0c;故也叫协议隔离。 网络…

mysql 数字to char_mysql数字tochar

例如,指定一个字段的类型为 INT(6), 就可以保证所包含数字少于 6 个的值从...二.字符串类型 MySQL 提供了 8 个基本的字符串类型,分别:CHAR、VARCHAR、......查看当前安装的 MySQL 所支持的字符集。 show charset; 或 show char set; ------------ | Charset | Description | D…

luogu P1880 [NOI1995]石子合并

咕咕咕 说好把济南集训时做的题写写题解还是鸽了然后因为太无聊又来续上了w 传送门~xiu 一道dp 具体是啥dp呢我去看看题解咋说 嗯 区间dp&#xff08;跟我想的一样 把环拆成链来做 n的范围比较小就直接枚举从哪断开 然后就是正常的dp 区间和用前缀和优化一哈 看代码吧 #include…

数据库更改到Java环境中实现可持续和平

对我们而言&#xff0c;可持续和平消除了不确定性。 在这种情况下&#xff0c;由于数据库更改而引起的想法是欢迎进行Ruby的Active Record迁移 。 迁移对我们意味着什么&#xff1f; 嗯&#xff0c;这是一种方便快捷的方法&#xff0c;可以以一致且简单的方式来改变我们的数据…

js页面加载前执行_做一名合格的前端开发工程师:Javascript加载执行问题探索

做前端开发少不了各种利器。比如我习惯用的还是Google浏览器和重型武器Fiddller。一&#xff1a;原始情况 首先大家看看如下的代码&#xff1a;估计90%的程序员都会把js文件放在head中&#xff0c;但是大家有没有深究过呢&#xff1f;很多浏览器都会使用单一的线程来做“界面UI…

【线性代数】3-5:独立性,基和维度(Independence,Basis and Dimension)

title: 【线性代数】3-5:独立性&#xff0c;基和维度(Independence,Basis and Dimension) categories: MathematicLinear Algebra keywords:IndependenceBasisDimensionSpan toc: true date: 2017-09-25 15:20:46Abstract: 本文是本章最重要的知识点&#xff0c;也是整个线性代…

Leetcode 648.单词替换

单词替换 在英语中&#xff0c;我们有一个叫做 词根(root)的概念&#xff0c;它可以跟着其他一些词组成另一个较长的单词——我们称这个词为 继承词(successor)。例如&#xff0c;词根an&#xff0c;跟随着单词 other(其他)&#xff0c;可以形成新的单词 another(另一个)。 现在…