|
|
|
|
移动端

1.5.4 带有限制的通配符

《数据结构与算法分析:Java语言描述(原书第3版)》第1章引论,在这一章, 我们阐述本书的目的和目标并简要复习离散数学以及程序设计的一些概念。本节为大家介绍带有限制的通配符。

作者:冯舜玺/陈越 译来源:机械工业出版社|2016-04-13 10:53

1.5.4 带有限制的通配符

图1-12显示一个static方法, 该方法计算一个Shape数组的总面积(假设Shape是含有area方法的类; 而Circle和Square则是继承Shape的类)。假设我们想要重写这个计算总面积的方法, 使得该方法能够使用Collection<Shape>这样的参数。Collection将在第3章描述。当前, 唯一重要的是它能够存储一些项, 而且这些项可以用一个增强的for循环来处理。由于是增强的for循环, 因此代码是相同的, 最后的结果如图1-13所示。如果传递一个Collection<Shape>, 那么, 程序会正常运行。可是, 要是传递一个Collection<Square>会发生什么情况呢?答案依赖于是否Collection<Square> IS-A Collection<Shape>。回顾1.4.4节可知, 用技术术语来说即是否我们拥有协变性。

我们在1.4.4节提到, Java中的数组是协变的。于是, Square[] IS-A Shape[]。一方面, 这种一致性意味着, 如果数组是协变的, 那么集合也将是协变的。另一方面, 我们在1.4.4节看到, 数组的协变性导致代码得以编译, 但此后会产生一个运行时异常(一个ArrayStoreException)。19因为使用泛型的全部原因就在于产生编译器错误而不是类型不匹配的运行时异常, 所以, 泛型集合不是协变的。因此, 我们不能把Collection<Square>作为参数传递到图1-13中的方法里去。

现在的问题是, 泛型(以及泛型集合)不是协变的(但有意义), 而数组是协变的。若无附加的语法, 则用户就会避免使用集合(collection),因为失去协变性使得代码缺少灵活性。

Java 5用通配符(wildcard)来弥补这个不足。通配符用来表示参数类型的子类(或超类)。图1-14描述带有限制的通配符的使用, 图中编写一个将Collection<T>作为参数的方法totalArea, 其中T IS-A Shape。因此, Collection<Shape>和Collection<Square>都是可以接受的参数。通配符还可以不带限制使用(此时假设为extends Object), 或不用extends而用super(来表示超类而不是子类); 此外还存在一些其他的语法, 我们就不在这里讨论了。


喜欢的朋友可以添加我们的微信账号:

51CTO读书频道二维码


51CTO读书频道活动讨论群:342347198

【责任编辑:book TEL:(010)68476606】

回书目   上一节   下一节
点赞 0
分享:
大家都在看
猜你喜欢

读 书 +更多

Web服务安全

Web服务技术是最近几年迅速兴起的一种应用集成技术,而安全问题是影响该技术广泛应用的一个关键因素。这个问题已成为最近几年来国内外研究...

订阅51CTO邮刊

点击这里查看样刊

订阅51CTO邮刊