java - 将扩展与 Java 泛型一起使用

标签 java generics

假设我有以下代码:

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/

相关文章:

java - 当属性是通用属性时,使用 xstream 将 XML 反序列化为对象

java - 为什么从另一个泛型方法调用的泛型可变参数方法会返回 Object[]?

java - org.hibernate.hql.internal.ast.QuerySyntaxException

java - PowerMockRunner 不应用 JUnit ClassRules

java - 在读取超时时写入 channel

java - 如何使用 lambda 表达式重构工厂类?

java - 数组大小和 .length 的问题

c# - 如何约束泛型类型必须有一个采用特定参数的构造函数?

java - 如何使用 Java 泛型将 "T"参数作为方法参数传递?

c# - 对实体使用泛型