有限的通用方法不编译 - 为什么?

时间:2011-06-07 11:54:15

标签: java generics

下面的代码对我来说是完全合理的 - 它是关于添加某种类型的元素,它是类型T的超类型,而类型S绝对是一种超类型,那么为什么编译器拒绝在集合中添加“元素”?

class GenericType<S,T extends S>{
   void add1(Collection<? super T> col ,S element ){
        col.add(element);  // error
       // The method add(capture#9-of ? super T) in the type 
       // Collection<capture#9-of ? super T> is not applicable for the arguments (S)
    }
}

4 个答案:

答案 0 :(得分:5)

举个例子,如果A <- B <- C <-表示这是超类型,那么如果S = BT = C您无法添加S的实例T

的集合

T的超类型可能是另一种超类型T的超类型或子类型(在本例中为S)。

答案 1 :(得分:2)

Collection<? super T> 表示“可以包含T及其任何超类的集合” - 实际上不可能制定该限制。这意味着“一个集合只能包含一些特定类的实例,它是T的超类” - 基本上它确保你可以在集合中添加T

可以使用Collection<T>调用该方法,但您想为其添加S

答案 2 :(得分:2)

new GenericType<Object,Integer>().add1(new ArrayList<Integer>(), "");

答案 3 :(得分:0)

您正在尝试将S类型的元素放入类型为T的集合中。泛型不是多态的。 你必须注意这里有两个问题。您正在尝试创建一个类型为具体的集合concreteObject extends Object并添加一个对象 所以,当你有

Car extends Vehicle{}
ElectricCar extends Car{}

你正在努力

Collection<? extends Car> collection;
collection.add(new Vehicle());

第二个问题在于泛型的非多态性。看到这个伟大的解释 - &gt; Is List<Dog> a subclass of List<Animal>? Why aren't Java's generics implicitly polymorphic?