なぜ私はこれを行うことができないのですか?
LinkedList<Fruit> myFruits = new LinkedList<Apple>();
エラーメッセージ:
Type mismatch: cannot convert from LinkedList<Apple> to LinkedList<Fruit>
次の違いはどこにありますか?
Fruit fruit = new Apple();
-で何ができるかを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>();
これで、リストにリンゴを追加できますが、タイプがわからないため、リストからリンゴを削除することはできません。
ポリモーフィズムは単にに適用されませんgeneric types
。
LinkedList<Fruit>
FruitはAppleのスーパークラスですが、同じではありませんLinkedList<Apple>
。
理由については、この回答を参照してください。
なぜなら、にを追加することができOrange
、myFruits
実際のリストはのリストであるため、それは機能しないはずです。Apple
たとえば(あなたがこれを作ることができれば);
List<Apple> myApples = new LinkedList<Apple>();
List<Fruit> myFruits = new LinkedList<Apple>();
myFruits.add(new Orange());
今myApplesはそれに入れOrange
ました
参照がコピーされ、元の参照は変更されないため、単純な割り当てが可能です。
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.