为什么我不能这样做:
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>();
现在您可以将苹果添加到列表中,但您不能将苹果从列表中删除,因为您也不知道该类型是什么。
因为那时你可以添加一个Orange
tomyFruits
并且这不应该工作,因为实际列表是一个列表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.