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
。
但我被告知这是一个错误汇编 - 为什么?
答案 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。