速来报名!AICon北京站鸿蒙专场~ 了解详情
写点什么

Richard Warburton 与 Raoul-Gabriel Urma 在 Devoxx UK 2015 上回顾 Java 泛型历史

  • 2015-07-05
  • 本文字数:1470 字

    阅读完需:约 5 分钟

Richard 与 Raoul 向广大开发者提供关于 Java 8 的培训课程。近日,二人在Devoxx UK 2015 上共同进行了一场演讲,回顾了Java 泛型的起源与动机、介绍了目前一些不为人知的特性,同时对Java 10 进行了展望。该演讲由3 个精彩的部分构成:泛型的过去、现在与未来。

过去

正如Richard 与Raoul 所说,在引入泛型之前,Java 中的集合是很难使用的,因为其中包含的是Object,我们无法确定集合中元素的具体类型。如果将任意类型的对象添加到集合中,那么其类型信息就会丢失,在获取对象时,开发者不得不手工将其强制转换为相关类型才能使用它。

这不仅会导致代码变得异常笨重,还使得我们无法限制添加到集合中的对象类型。2004 年发布的 Java 5 通过增加泛型特性解决了这个问题,不过为了保持向后兼容,泛型只能通过类型擦除来实现。

现在

接下来,Richard 与 Raoul 谈到了目前 Java 泛型的一些特性,特别是一些不为人知的特性:交叉类型、通配符与 F 绑定多态。

“交叉类型”特性使用起来相对简单,它指的是集合中元素的类型需要继承两个或多个类或接口。而通配符则不那么好理解。Richard 指出:

通配符是个难以理解且难以使用的特性。过去在 Java 中,你无法表达出参数的协变与逆变的概念,对于声明为某个接口类型的变量来说,你每次都需要在变量声明时表示出其类型信息。这将复杂性由库的作者推给了每一个人。

尽管如此,Richard 与 Raoul 通过将不同的通配符关联到生产者与消费者的概念上阐述了程序员如何可以从中获益。

生产者会生产出对象供其他类使用。为了让这些类知道该如何使用这些对象,我们使用了一个“契约”,表示出可以提供的最为具体的类型。该“契约”采取了继承通配符的形式,具体来说就是 Class<? extends T>。这表示泛型类所使用的类型是 T 或 T 的子类,这意味着你可以使用 T 所具有的所有行为。

与之类似,消费者接收并使用对象。为了让其他类知道可以将何种类型的对象传递给消费者,消费者需要指定保证会接收的最具体的类型。它采取了 super 通配符的形式,具体来说就是 Class<? super T>。该符号表示我们打算将类型为 T 的对象赋给消费者,这样消费者就可以处理类型 T 或 T 的父类的对象了。

最后,二位演讲者又谈到了 F 绑定多态,他们将其称作“奇特的递归泛型模式”(类比于 C++ 中奇特的递归模板模式)。在这种泛型形式中,类型参数会递归地引用泛型类型本身,如下所示:

复制代码
public interface ClassName<T extends ClassName<T>>

正如演讲中所提到的,该特性在泛型类型中的方法需要返回模板类型时是非常有用的,比如说克隆对象时。

未来

在演讲的最后一部分中,二位演讲者继续介绍目前尚在讨论之中的对泛型的一些改进,这些改进可能会添加到 Java 10 中。一方面,目前正在解决原生类型的泛型问题,这样就无需自动装箱与自动拆箱了;这与项目 Valhalla 紧密相关。Richard 说到,这些修改可以让程序员编写出下面这样的代码:

复制代码
List<int> integers = new ArrayList<>();
integers.add(1);

Richard 说到,底层可以将其实现为 int[] 而非目前的 Integer[],这么做一方面可以减少内存占用,另一方面可以让 CPU 的缓存预先抓取器工作得更好。他补充说到:“这会改进性能,就像 C#的具化泛型一样”。

另一方面,让库的作者在接口声明而非现在这样在接口使用时表明变化,可以简化协变与逆变的处理。这种声明变量的形式可以让大多数开发者从通配符泛型中获益,从而无需了解关于底层的更多信息,同时高级程序员还可以覆写这种默认行为以实现更加专门的代码。

查看英文原文: Richard Warburton and Raoul-Gabriel Urma Review the History of Generics in Java at Devoxx UK

2015-07-05 04:50935
用户头像

发布了 88 篇内容, 共 263.0 次阅读, 收获喜欢 8 次。

关注

评论

发布
暂无评论
发现更多内容

安全可信丨两个项目新入选可信边缘计算推进计划!

天翼云开发者社区

前端刷完这12道滑动窗口,就可以出山面试了

js2030code

JavaScript LeetCode

前端leetcde算法面试套路之双指针

js2030code

JavaScript LeetCode

微信业务架构-探讨

Weldon

架构实战营

程序员买啥游戏机,自己动手做一个体感小游戏

华为云开发者联盟

人工智能 华为云 企业号十月 PK 榜 体感小游戏

JavaScript刷LeetCode拿offer-贪心算法

Geek_07a724

JavaScript LeetCode

转转图书对基于Drools引擎的DMN实践

转转技术团队

drools 规则引擎使用 规则引擎 转转 java 编程

JavaScript刷LeetCode拿offer-分治

Geek_07a724

JavaScript LeetCode

一文全面了解火山语音无监督预训练技术的落地实践

科技热闻

企业数字化转型思考

dreamer

软件 数字化转型 信息化 制造业 智能化

【学习记录】SQL注入--盲注

w010w

网络安全 学习笔记 CTF SQL注入 11月月更

前端leetcde算法面试套路之回溯

js2030code

JavaScript LeetCode

如何使用清源CleanSource SCA建立软件物料清单(SBOM)

安势信息

SCA 软件物料清单 SBOM 清源CleanSource SCA

浅谈系统稳定性与高可用保障的几种思路

得物技术

高可用 架构设计 稳定性 稳定性保障 10月月更

数字先锋| 打造城市“一朵云”,天翼云推动芜湖新型智慧城市建设

天翼云开发者社区

HummerRisk 使用场景:混合云安全治理(1)简介

HummerCloud

混合云 安全合规检测 11月月更

个保法一周年,每日互动(个推)分享隐私计算探索及实践

个推

大数据 联邦学习 数据治理 隐私计算 隐私安全

云安全厂商那么多,我们该怎么选择?

行云管家

云计算 企业上云 云厂商 云转售

乐高式扩展:在Seal软件供应链防火墙中轻松集成代码规范工具

SEAL安全

开源 DevOps 云原生 DevSecOps 软件供应链安全

JavaScript刷LeetCode拿offer-并查集

Geek_07a724

JavaScript LeetCode

实例解读丨关于GaussDB ETCD服务异常

华为云开发者联盟

数据库 华为云 企业号十月 PK 榜

一文读懂加密资产板块的盈利潜力与投资机会

股市老人

原生 JS 手写一个优雅的图片预览功能,带你吃透背后原理

茶无味的一天

JavaScript 前端 HTML5, CSS3 图片预览

共享存储是什么意思?与DRBD有什么区别?

行云管家

高可用 ha Skybility HA 高可用性

持续领跑,天翼云市场份额再攀升

天翼云开发者社区

三项第一!天翼云通过DevSecOps能力成熟度评估认证

天翼云开发者社区

BizWorks 应用平台基于 KubeVela 的实践

阿里巴巴云原生

阿里云 开源 云原生

【融云出海白皮书免费看】-巴西成增量潜力「应许之地」

融云 RongCloud

互联网 白皮书

软件测试面试真题 | 经典SQL查询

测试人

数据库 软件测试 面试题 sql 测试开发

亮相IDC年度盛典,天翼云以科技创新谱写数字化转型新乐章

天翼云开发者社区

Richard Warburton与Raoul-Gabriel Urma在Devoxx UK 2015上回顾Java泛型历史_Java_Abraham Marín Pérez_InfoQ精选文章