java - 我可以添加到扩展 A 的类型 B 的类型 A 值的通用集合中,而不需要任何特殊语法吗?

标签 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 扩展了 Number,因此我可以将整数集合添加到 numberStack 中。 但我被告知这是一个错误编译 - 为什么?

最佳答案

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

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

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

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

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

关于java - 我可以添加到扩展 A 的类型 B 的类型 A 值的通用集合中,而不需要任何特殊语法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7254820/

相关文章:

java - Java 中使用泛型进行继承

Java,子类返回泛型的泛型

Java 泛型 - 类型参数 String 隐藏了 String 类型

php - 如何在 MAC/OSX 上从源代码编译 PHP

javascript - 如何从 React Native 中的字符串运行 javascript 逻辑?

c++ - 编译器如何遍历一个类?

java - Activity 之间的变化不起作用

java - 使用 spring 集成 IMAP 适配器,如何手动获取标记为 "unread"的电子邮件?

java - JEdi​​torPane - 没有 HEIGHT 参数的 IMG 标签

java - 将 Java 对象转换为 XML