泛型集合和数组

集合:

下面的这段代码是无效的:

1 List<Apple> apples = ...;
2 List<Fruit> fruits = apples;

下面的同样也不允许:

1 List<Apple> apples;
2 List<Fruit> fruits = ...;
3 apples = fruits;

为什么?一个苹果是一个水果,为什么一箱苹果不能是一箱水果?

在某些事情上,这种说法可以成立,但在类型(类)封装的状态和操作上不成立。如果把一箱苹果当成一箱水果会发生什么情况?

1 List<Apple> apples = ...;
2 List<Fruit> fruits = apples;
3 fruits.add(new Strawberry());

如果可以这样的话,我们就可以在list里装入各种不同的水果子类型,这是绝对不允许的。

另外一种方式会让你有更直观的理解:一箱水果不是一箱苹果,因为它有可能是一箱另外一种水果,比如草莓(子类型)。

 

数组:

1 Apple[] apples = ...;
2 Fruit[] fruits = apples;

可是稍等一下!如果我们把前面的那个议论中暴露出的问题放在这里,我们仍然能够在一个apple类型的数组中加入strawberrie(草莓)对象:

1 Apple[] apples = new Apple[1];
2 Fruit[] fruits = apples;
3 fruits[0] = new Strawberry();

这样写真的可以编译,但是在运行时抛出ArrayStoreException异常

你可能感兴趣的:(apple)