下面的代码对我来说是完全合理的 - 它是关于添加某种类型的元素,它是类型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)
}
}
答案 0 :(得分:5)
举个例子,如果A <- B <- C
<-
表示这是超类型,那么如果S = B
和T = 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?