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

public class Stack { public Stack () {....} public void push (E e) {....} public E pop () {....} public boolean isEmpty(){....} } public void pushAll (Collection src) { for (E e: src){ push(e) } } 

如果我写的话,我不明白会出现什么问题

 Stack numberStack = new Stack(); Collection integers=... numberStack.pushAll(integers); 

整数扩展了Number,所以我可以将一个Integers集合添加到numberStack 。 但我被告知这是一个错误汇编 – 为什么?

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

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

 public void pushAll (Collection src) 

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

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

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

 pushAll(Collection src) 

并将K投入E.

这个问题是因为java中的集合不是协变的 。 关于它的问题有很多问题,例如这个问题 。