【发布时间】:2018-08-05 07:19:29
【问题描述】:
我有课:
class Animal{
public void type(){
System.out.println("I am Animal");
}
}
class Dog extends Animal{
public void type(){
System.out.println("I am Dog");
}
}
class Cat extends Animal{
public void type(){
System.out.println("I am Cat");
}
}
class Haski extends Dog{
public void type(){
System.out.println("I am Haski");
}
}
然后我用wildcards 创建List:
List<? extends Animal> animalList = new ArrayList<Animal>();
我知道我不能向animalList 添加一些对象。我在不同的书籍、互联网上的文章、视频课程中读到过它,但我仍然不明白为什么?如果我们认为animalList 只包含对象extends Animal,为什么java 不能添加任何objects extends Animal 并将其转换为Animal?
animalList.add(new Dog()); //cast dog to Animal
animalList.add(new Cat()); //cast cat to Animal
编译器有足够的信息 - objects extends Animal 为什么它不能转换?
编辑:
所以我没有正确理解。
List<Animal> animalList1 = new ArrayList<Animal>();
animalList.add(new Animal());
animalList.add(new Dog());
animalList.add(new Cat());
animalList.add(new Haski());
和
List<? extends Animal> animalList
有一种感觉,它们应该是一样的。但我感觉不到原则上的区别
【问题讨论】:
-
List<? extends Animal> animalList不需要只保留ArrayList<Animal>();。它还可以包含List<Dog>(旨在仅包含Dogs 或其子类型的列表)所以您是否希望编译器允许您将Cat对象添加到此类列表中? -
将
? extends Animal视为扩展Animal的一个非常具体(但未知)的类。出现您的理解问题是因为您认为这意味着任何扩展Animal的类。 -
List<Animal>和List<? extends Animal>不是同一类型。您可以将List<Dog>分配给List<? extends Animal>变量,但不能将其分配给List<Animal>变量。