文档章节

鲜为人知的Java8特性:泛化目标类型推断

Big_BoBo
 Big_BoBo
发布于 2014/01/02 08:50
字数 808
阅读 151
收藏 8
点赞 0
评论 0
本文由 ImportNew - 彭秦进 翻译自 javacodegeeks。如需转载本文,请先参见文章末尾处的转载要求。

ImportNew注:如果你也对Java技术翻译分享感兴趣,欢迎加入我们的 Java开发 小组。参与方式请查看小组简介。

在浏览Java8的特性列表的时候,目标类型推断这个特别有趣的、鲜为人知的特性一下子吸引了我。Java语言的设计者通过它让我们减轻了一些使用泛型时(Java5-7)的痛苦。让我们来看看过去泛型使用的示例:

class List<E> {
  static <Z> List<Z> nil() {..}
  static <Z> List<Z> cons(Z head, List<Z> tail) {..}
  E head() {..}
}
在上述例子,在 JEP:101中声称可以用下面的方法更好地表示:
// 建议写法:
List.cons(42, List.nil());
String s = List.nil().head();
 
// 不推荐的写法:
List.cons(42, List.<Integer>nil());
String s = List.<String>nil().head()
作为一个 熟练的API设计师,在Java路线图中看到示例中的进步着实令人激动。这些令人兴奋的变化究竟包含了什么?让我来更加详细地说明:
// 通过赋值语句推断泛型的类型
List<String> 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<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 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
[ 转载请保留原文出处、译者和译文链接。]

本文转载自:http://www.importnew.com/8301.html

共有 人打赏支持
Big_BoBo
粉丝 52
博文 54
码字总数 22137
作品 0
杭州
高级程序员
Java 8新特性探究(6):泛型的目标类型推断

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

独孤环宇
2017/11/03
0
0
Java 8新特性探究(六)泛型的目标类型推断

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

OSC闲人
2013/12/14
0
3
利用java8新特性实现类似javascript callback特性

Java8的新特性之一,就是首次引入了函数式编程Lambda表达式,按oracle的说法,是为了引导java向函数式编程的方向发展。 在JDK1.8中,多了一个包,java.util.function,这里主要用到了这个包下...

Acce1erator
2015/12/02
1K
3
黑马程序员----JDK1.5新特性之泛型

泛型是Jdk1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。这种参数类型可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口、泛型方法。 Java语言...

长平狐
2013/07/01
115
0
JAVA8新特性之:方法引用

什么是方法引用 方法引用是用来直接访问类或者实例的已经存在的方法或者构造方法。方法引用提供了一种引用而不执行方法的方式,它需要由兼容的函数式接口构成的目标类型上下文。计算时,方法...

落叶追风
2016/12/07
1K
0
(翻译)Java SE 8 Lambda 特性与基本原理(上)

Lambda 语言特性与原理 java se 8 edition 本文章是Java语言规范-JSR335 中对Java语言一些新功能的非正式描述,这些增强性功能已被OpenJDK 的Lambda项目实现。并且该文章细化了上次发布在201...

麦壳原野
2013/12/16
0
6
EasyIOS: 如何提升 iOS 开发效率

随着苹果发布了swift语言,很多人拿OC与之对比,下面是苹果列出的Swift几项特性(它们不包含Objective-C已经有的特性,比如自动内存管理) 类型推断(Inferred types) – 类型推断让代码更清...

墨水
2014/11/10
4.7K
5
Java8实战 — Lambda表达式详解

Lambda管中窥豹 可以把Lambda表达式理解为简洁地表示可传递的匿名函数的一种方式:它没有名称,但它有参数、函数主体和返回类型,可能还有一个可以抛出的异常列表。 何为更简介,做一个例子,...

杰克鹏仔
2016/12/27
16
0
30分钟入门Java8之lambda表达式

30分钟入门Java8之lambda表达式 前言 Google在今年发布Android N开发者预览版,一并宣布开始支持Java 8。我们终于能在Android开发中使用到Java8的一些语言特性了。目前支持: 默认方法 lamb...

spinachgit
01/12
0
0
java8 lambda表达式与集合类批处理操作

一、基本概念 λ表达式可以被当做是一个Object。λ表达式的类型,叫做“目标类型(target type)”。λ表达式的目标类型是“函数接口(functional interface)”,这是Java8新引入的概念。它...

cloud-coder
2014/03/31
0
1

没有更多内容

加载失败,请刷新页面

加载更多

下一页

istio 路由实例解析

根据链路追踪图如上: 资料:https://istio.io/docs/guides/bookinfo/ 流程解析: 1. 访问地址: http://IP:31380/productpage kubectl get svc --all-namespaces -o wide istio-system isti......

xiaomin0322
11分钟前
2
0
Centos7通过yum安装jdk8

先查看系统是否已有自带的jdk rpm -qa |grep java rpm -qa |grep jdk rpm -qa |grep gcj 如果没有输出信息,则说明系统没有安装。如果有输出信息,则执行下面的命令卸载 rpm -qa | grep jav...

iplusx
13分钟前
0
0
字体的动画

树不要皮必死无疑,人不要脸天下无敌。如果你此时正在被承受着不公平的待遇,不要伤心不要气馁,吃亏要趁早。 .menu ul li a { position:relative; color: #FFFFFF; text-decoration:...

Js_Mei
14分钟前
0
0
新手学习hadoop发行版本选择介绍

Hadoop对于从事互联网工作的朋友来说已经非常熟悉了,相信在我们身边有很多人正在转行从事hadoop开发的工作,理所当然也会有很多hadoop入门新手。Hadoop开发太过底层,技术难度远比我们想象的...

左手的倒影
14分钟前
0
0
iOS定时器循环引用问题解决

我们通常使用NSTimer或CADisplayLink会使用以下方式 //定义@property (nonatomic, strong)NSTimer *timer;//实现self.timer = [NSTimer scheduledTimerWithTimeInterval:1 target:p......

xiaobai1315
15分钟前
0
0
给wordpress程序提速

在上一节中,我们介绍了wordpress CMS主题提速,本节我们接着介绍wordpress主题提速:gravatar用户头像缓存和google字体去除。 gravatar头像受到全世界网络用户的喜爱,设置好gravatar头像后...

hero2019
17分钟前
0
0
DevExpress v18.1最新版帮助文档下载大全

DevExpress v18.1.4帮助文档下载列表大全来啦!包含.NET、VCL、HTML/JS系列所有帮助文档,提供CHM和PDF两个版本。除已停止更新的Silverlight、Windows 8外,其余均为最新版本。 文章底部扫描...

Miss_Hello_World
21分钟前
0
0
Unity Shader中各种空间及变换方法

前几天尝试写一个传送门的shader,发现自己对坐标之间的变换掌握的不够熟练,趁着这阵子想整理shader相关的知识点,先把各种空间及之间转换整理一下。 1 模型空间-世界空间-观察空间-裁剪空间...

爽歪歪ES
26分钟前
0
0

定义和应用 栈(stack)是一种特殊的线性表,其插入(也称入栈或压栈)和删除(也称出栈或弹栈)操作都在表的同一端进行。这一端被称为栈顶(top)另一端称为栈底端(bottom)。 我们生活中其实...

Frost729
28分钟前
0
0
数据分析挖掘学习干货:大数据处理技术的总结与分析

一 数据分析处理需求分类 1 事务型处理 在我们实际生活中,事务型数据处理需求非常常见,例如:淘宝网站交易系统、12306网站火车票交易系统、超市POS系统等都属于事务型数据处理系统。 这类系...

加米谷大数据
33分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部