【ArchSummit架构师峰会】探讨数据与人工智能相互驱动的关系>>> 了解详情
写点什么

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:50825
用户头像

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

关注

评论

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

听软件测试自动化“领导者”讲解如何降本、增效与提质

龙智—DevSecOps解决方案

测试 自动化测试 测试自动化

世界杯太精彩了,带大家用Python做个足球游戏,边玩游戏边看比赛

Lansonli

Python游戏 Python足球游戏 世界杯足球游戏

亚马逊CTO Werner Vogels 演讲Keynote:世界一直无序地运转向前 @AWS re:Invent 2022

B Impact

36kr企服点评启发:“信任的基础是真实,只要做到真实,一定能够建立起双向信任”

B Impact

【MindStudio训练营第一季】MindStudio Profiling随笔

Angel Wings

华为 AI 调优 MindStudio Ascend

HummerRisk 入门3:开发手册

HummerCloud

云安全 云原生安全 12月月更

信息安全等级保护的5个级别分别是什么?最高级别是哪个?

行云管家

等保 等级保护

2023来袭,分享500道我收集的Java架构面试题

钟奕礼

Java 程序员 java面试 java编程

2022年第三季度汽车品牌智能网联竞争力指数(ICVCI)分析

易观分析

汽车 易观分析 智能网联

从今天起真正释放创造力 | Werner Vogels 在 re:Invent 2022带来多项开发者福音

亚马逊云科技 (Amazon Web Services)

亚马逊云科技

代码安全与质量 | 在这个充满变数的时代,花小钱办大事

龙智—DevSecOps解决方案

代码质量 代码安全检测 代码安全 安全防护

隐藏复杂、抽象概念,「技术无感化」 ——The Future of Database2022 | 黄东旭新番

B Impact

【MindStudio训练营第一季】MindStudio 高精度对比随笔

Angel Wings

MindStudio

为什么我们不支持手工上传镜像

Jianmu

Docker 容器 镜像

通过认证|龙智正式成为Atlassian云专业伙伴

龙智—DevSecOps解决方案

云原生

软件测试 | 测试核心:如何减少线上故障?

测试人

软件测试 软件质量 自动化测试 测试开发

神秘新品即将来袭!大上科技开启护眼新未来倒计时

硬科技星球

可观测性神器之Micrometer

宋小生

监控 可观测性 micrometer

React 之 Refs 的使用和 forwardRef 的源码解读

冴羽

JavaScript react.js 前端 前端框架 React

版本控制 | 一文了解什么是组件化开发,以及如何从单体架构转向组件化开发

龙智—DevSecOps解决方案

组件化 组件化开发

觅健牵手博鳌医院战略合作:即时优享全球肿瘤创新治疗方案

联营汇聚

面试官:你先回去等通知吧!这个Java岗位我还有机会吗?

钟奕礼

Java java面试 java编程 程序员、

如何设计业务异地多活架构 - week7

in9

实时数据赋能制造业产能升级:详解半导体和汽车制造行业最佳实践(活动报名)

tapdata

制造业 数据集成 汽车制造 实时数据 半导体行业

金融信创正当时!看这家银行如何实现数据仓库与营销平台国产替换?

索信达控股

数据库 银行 数据库迁移 智能营销

【MindStudio训练营第一季】MindStudio 专家系统随笔

Angel Wings

mindspore MindStudio

【MindStudio训练营第一季】MindStudio 可视化AI应用开发体验随笔

Angel Wings

MindStudio

手机银行APP评测系列:天津银行持续优化手机银行用户体验,但仍需加强细节提升

易观分析

手机银行 用户

双机互备是什么意思?双机互备就是双机热备吗?

行云管家

双机热备 双机互备

连阿里P8都赞不绝口的“分布式架构原理设计笔记”到底有多牛

小小怪下士

Java 程序员 分布式 架构设计

一个月面试了3家大厂Java岗,我发现这几个突破点

钟奕礼

Java 程序员 java面试 java编程

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