泛型的引入使得 Java 语言中的类型系统更加复杂。以前,该语言具有两种类型 —— 引用类型和基本类型。对于引用类型,类型 和类 的概念基本上可以互换,术语子类型 和子类 也可以互换。
随着泛型的引入,类型和类之间的关系变得更加复杂。List<Integer>
和 List<Object>
是不同的类型,但是却是相同的类。尽管 Integer
扩展 Object
,但是 List<Integer>
不是 List<Object>
,并且不能赋给 List<Object>
或者强制转换成 List<Object>
。
另一方面,现在有了一个新的古怪的类型叫做 List<?>
,它是 List<Integer>
和 List<Object>
的父类。并且有一个更加古怪的 List<? extends Number>
。类型层次的结构和形状也变得复杂得多。类型和类不再几乎是相同的东西了。
extends 的新含意
在 Java 语言引入泛型之前,extends
关键字总是意味着创建一个新的继承自另一个类或接口的类或接口。
引入泛型之后,extends
关键字有了另一个含意。将 extends
用在类型参数的定义中(Collection<T extends Number>
)或者通配符类型参数中(Collection<? extends Number>
)。
当使用 extends
来指示类型参数限制时,不需要子类-父类关系,只需要子类型-父类型关系。还要记住,有限制类型不需要是该限制的严格子类型;也可以是 该限制。换句话说,对于 Collection<? extends Number>
,您可以赋给它 Collection<Number>
(尽管 Number
不是 Number
的严格子类型)和 Collection<Integer>
、Collection<Long>
、Collection<Float>
等等。
在任何这些含意中,extends
右边的类型都可以是参数化类型(Set<V> extends Collection<V>
)。
posted on 2005-08-24 11:36
Dave 阅读(187)
评论(0) 编辑 收藏