假设我有以下代码:
public class Shelter<A extends Animal, B extends Animal>
{
List<A> topFloor = new Vector<A>();
List<B> bottomFloor = new Vector<B>();
public A getFirstTopFloorAnimal(){return topFloor.get(0);}
public B getFirstBottomFloorAnimal(){return bottomFloor.get(0);}
//These 3 methods compile but when I try to use it, they all only return objects
public List<Animal> getAnimals()
{
List<Animal> a = new Vector<Animal>(topFloor);
a.addAll(bottomFloor);
return a;
}
public List<A> getTopFloor(){return topFloor;}
public List<B> getBottomFloor(){return bottomFloor;}
}
然后我尝试做如下的事情:
for(Animal a : shelter.getTopFloor()){
a.growl();
}
但是我的编译器错误,我得到的错误是 A 是一个对象,而不是动物。如果我尝试使用其他方法,也会发生同样的情况。任何想法为什么会这样?这是否与 List<String>
有关?不是 List<Object>
泛型教程中的想法?
谢谢
最佳答案
泛型只是一个编译时概念,目的是提高类型安全性。
您不能使用它们来过滤在运行时添加到集合中的值。您必须手动进行过滤(例如使用 instanceOf
)
例如,这会起作用并让您添加一个Date
:
List<String> list = new ArrayList<String>();
((List) list).add(new Date());
因此,解决您的(我们尚未发现的)问题的方法是在添加元素时不使用原始类型。
关于java - 将扩展与 Java 泛型一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2662333/