通配符泛型
Test<SubObject>继承Test<? extends BaseObject>
Test<SubObject>和Test<T extends BaseObject>无任何关系
高级别数组可以赋给低级别数组,反之则不可以。
SubObejct[] objects=...
BaseObject[] baseObjects=objects;
java泛型都会擦除泛型类型,泛型类型转换为Object,如果使用extends,则转换为基类类型,不能用instanceof判断类型
java一般不能使用==判等,需要使用equal,==只比较引用相同
?super SubObject 通配符超类型,支持set
?extends BaseObject 支持get
向上造型一个泛型对象的引用
例如,假设我们有很多箱子,每个箱子里都装有不同的水果,我们需要找到一种方法能够通用的处理任何一箱水果。更通俗的说法,A是B的子类型,我们需要找到一种方法能够将C<A>类型的实例赋给一个C<B>类型的声明。
为了完成这种操作,我们需要使用带有通配符的扩展声明,就像下面的例子里那样:
- List<Apple> apples = new ArrayList<Apple>();
- List<? extends Fruit> fruits = apples;
“? extends”是泛型类型的子类型相关性成为现实:Apple是Fruit的子类型,List<Apple> 是 List<? extends Fruit> 的子类型。
向下造型一个泛型对象的引用
现在我来介绍另外一种通配符:? super。如果类型B是类型A的超类型(父类型),那么C<B> 是 C<? super A> 的子类型:
- List<Fruit> fruits = new ArrayList<Fruit>();
- List<? super Apple> = fruits;