写点什么

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

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

关注

评论

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

Minio环境搭建

飞鸟

Minio 分布式文件存储

WEB图像优化

devpoint

性能优化 image 图像格式 10月月更

在线字符串哈希/散列工

入门小站

工具

Go 扇入 / 扇出

baiyutang

golang 10月月更

👊 【Spring技术特性】带你看看那些可能你还不知道的特性技巧哦!

洛神灬殇

Java spring Spring特性 10月月更

博鳌亚洲论坛国际科技与创新论坛第二届大会区块链分论坛紧密筹备中

时空云

区块链 博鳌 亚洲论坛

初始化 Ubuntu 工作环境

看山

ubuntu 10月月更

Prometheus 基础查询(四)修饰符

耳东@Erdong

Prometheus 10月月更

【设计模式】第四篇 - 简单工厂

Brave

设计模式 工厂模式 10月月更

Linux system hardening: adding hidepid to /proc mount point

卓丁

Linux linux security proc hidepid

趣说 Node.js 的事件循环

Regan Yue

node.js Regan Yue 10月月更

分布式文件存储系统Minio实战

飞鸟

Minio 分布式文件存储

linux之awk使用技巧

入门小站

Linux

微博评论高性能高可用计算架构设计

看,有只猪

018云原生之基础架构

穿过生命散发芬芳

云原生 10月月更

CPU、指令集、微架构概念学习

轻口味

10月月更

Win11安装PyTorch

IT蜗壳-Tango

10月月更

【Flutter 专题】133 图解自定义 ACEWaterButton 水波纹按钮

阿策小和尚

Flutter 小菜 0 基础学习 Flutter Android 小菜鸟 10月月更

Spring 框架学习

风翱

spring 10月月更

5分钟搞懂Monorepo

俞凡

git 架构

【LeetCode】环形链表Java题解

Albert

算法 LeetCode 10月月更

Kafka 生产环境部署指南

Se7en

【架构实战营作业】模块五——微博评论计算架构

聆息

未来已来,运营商如何驱动区块链应用创新提速?

CECBC

人工智能解决方案 --- 智能运维(AIOps)

micklongen

人工智能 AIOPS 知识图谱 智能运维 数据工程

linux【redhat&ubuntu】下ffmpeg-3.1安装编译及视频转码

程序员架构进阶

架构 ffmpeg 视频流 10月月更

API网关Kong实战

飞鸟

kong api 网关 API Gateway

官方线索|科大讯飞全球1024开发者节

xcbeyond

1024我在现场

区块链将规则写入代码 重构市场新制度

CECBC

【产品】论增长黑客思维如何让B端产品爆发式增长

极光一号。

云原生 用户增长 b端产品经理 增长黑客

Gas 机制是如何运作的

Rayjun

以太坊

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