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>FruitAppleのスーパークラスですが、同じではありませんLinkedList<Apple>

理由については、この回答を参照してください。

于 2013-01-03T15:10:14.293 に答える
0

なぜなら、にを追加することができOrangemyFruits実際のリストはのリストであるため、それは機能しないはずです。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 に答える