BT

如何利用碎片时间提升技术认知与能力? 点击获取答案

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

| 作者 Abraham Marín Pérez 关注 9 他的粉丝 ,译者 张龙 关注 14 他的粉丝 发布于 2015年7月6日. 估计阅读时间: 5 分钟 | QCon上海2018 关注大数据平台技术选型、搭建、系统迁移和优化的经验。

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

评价本文

专业度
风格

您好,朋友!

您需要 注册一个InfoQ账号 或者 才能进行评论。在您完成注册后还需要进行一些设置。

获得来自InfoQ的更多体验。

告诉我们您的想法

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我
社区评论

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

讨论

登陆InfoQ,与你最关心的话题互动。


找回密码....

Follow

关注你最喜爱的话题和作者

快速浏览网站内你所感兴趣话题的精选内容。

Like

内容自由定制

选择想要阅读的主题和喜爱的作者定制自己的新闻源。

Notifications

获取更新

设置通知机制以获取内容更新对您而言是否重要

BT