java - 为什么没有列表<?扩展 A> 接受扩展 A 的 B 的实现吗?

标签 java generics

为什么这不起作用?我认为该列表能够接受作为 A 实例的任何对象。 .

import java.util.List;

public class Test {

    interface A {}

    interface B extends A {}

    class BImpl implements B {}

    List<? extends A> listOfAExtensions;

    void function() {
        B b = new BImpl();
        listOfAExtensions.add(b);
        // error
        // The method add(capture#1-of ? extends Test.A)
        // in the type List<capture#1-of ? extends Test.A>
        // is not applicable for the arguments (Test.B)
    }
}

最佳答案

List<? extends A> listOfAExtensions

不等于

List<A> listOfAExtensions

因为你可以分配

List<? extends A> listOfAExtensions = new ArrayList<CImpl>();

其中CImpl是与BImpl无关的A的实现。如果您可以在此之后将 BImpl 添加到 listOfExtensions 中,那么您将添加一个 BImpl 到不相关的 CImpl 列表,这是没有意义的。因此,编译器不允许您将 BImpl 实例添加到 listOfAExtensions

关于java - 为什么没有列表<?扩展 A> 接受扩展 A 的 B 的实现吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49126689/

相关文章:

java - 从 HashMap 中删除正在运行的线程

java - 在 Java 接口(interface)中声明参数子类型,在 Java 实现方法中使用子类型

java - 引用类型依赖 - 将 Map.Entry 声明为依赖于为 TreeMap 声明的泛型类型

generics - 使用泛型存储和生成类的实例

java - Java Swing 中的全局键盘记录器

java - 在AChartEngine中调用remove(index)

java - 通用静态数组声明

c++ - 通用 Constexpr 查找表 C++11

java - ESAPI.properties 中的最少必需属性

java - 为什么 SwingUtilities.invokeLater() 会导致 JButton 卡住?