2

为什么我不能这样做:

LinkedList<Fruit> myFruits = new LinkedList<Apple>();

错误信息:

Type mismatch: cannot convert from LinkedList<Apple> to LinkedList<Fruit>

和下面的区别在哪里?

Fruit fruit = new Apple();
4

4 回答 4

10

考虑一下您可以使用LinkedList<Fruit>- 做什么,并考虑您希望此代码做什么:

LinkedList<Apple> apples = new LinkedList<Apple>();
LinkedList<Fruit> fruits = apples;
fruits.add(new Banana());

Apple apple = apples.getFirst(); // Safe at compile time, but it's a Banana!

转换是唯一在编译时失败的地方。现在你可以写的是:

LinkedList<? extends Fruit> myFruits = new LinkedList<Apple>();

...然后编译器不会让您向列表中添加任何内容,因为它不知道真正的元素类型是什么。同样你可以写:

LinkedList<? super Apple> apples = new LinkedList<Fruit>();

现在您可以苹果添加到列表中,但您不能将苹果列表中删除,因为您也不知道该类型是什么。

于 2013-01-03T15:09:41.590 回答
1

多态性根本不适用于generic types.

LinkedList<Fruit>LinkedList<Apple>与即使FruitApple的超类也不相同。

原因参考这个答案

于 2013-01-03T15:10:14.293 回答
0

因为那时你可以添加一个OrangetomyFruits并且这不应该工作,因为实际列表是一个列表Apple

例如(如果你能做到);

List<Apple> myApples = new LinkedList<Apple>();
List<Fruit> myFruits = new LinkedList<Apple>();
myFruits.add(new Orange());

现在 myApples 加入Orange

于 2013-01-03T15:09:36.587 回答
0

允许进行简单的分配,因为引用被复制而原件保持不变。

Apple apple = new Apple();
Fruit fruit = apple;
fruit = new Banana(); // apple is not touched and is still an Apple

而(AtomicReference 是一个简单的集合)

AtomicReference<Apple> apple = new AtomicReference<>(new Apple());
AtomicReference<Fruit> fruit = (AtomicReference) apple; // warning but compiles.
fruit.set(new Banana()); // this alters apple as well, making it invalid!
Apple apple2 = apple.get(); // throws ClassCastException.
于 2013-01-03T15:17:29.813 回答