我可以添加类型B的A类值的泛型集合,它扩展了A,没有任何特殊语法吗?

时间:2011-08-31 09:07:09

标签: java generics compilation

public class Stack<E> {
    public Stack () {....}
    public void push (E e) {....}
    public E pop () {....}
    public boolean isEmpty(){....}
}

public void pushAll (Collection<E> src) {
    for (E e: src){
        push(e)
    }
}

如果我要写

,我不明白会出现什么问题
Stack<number> numberStack = new Stack<Number>();
Collection<Integer> integers=...
numberStack.pushAll(integers);

Integer extends Number,所以我可以将一个Integers集合添加到numberStack。 但我被告知这是一个错误汇编 - 为什么?

3 个答案:

答案 0 :(得分:12)

您的代码指定接受与Collection具有相同类型参数的Stack

您应该像这样编写pushAll方法:

public void pushAll (Collection<? extends E> src)

这意味着您希望Collection 某些类型扩展E(即您不关心它是什么特定类型,但它必须E或其中某种子类型。)

查看Collection.addAll()的定义:它以相同的方式定义。

答案 1 :(得分:1)

问题是你有两种类型,但只有一种通用表示(E),所以E是数字和整数。多数民众赞成他。您需要为集合使用相同的类型。将其重写为

pushAll(Collection<K> src) 

并将K投射到E。

答案 2 :(得分:1)

这个问题归因于collections in java are not covariant。关于它的问题有很多问题,例如this one