【问题标题】:Why doesn't List<? extends A> accept an implementation of B which extends A? [duplicate]为什么不列出<?扩展 A> 接受扩展 A 的 B 的实现? [复制]
【发布时间】:2018-03-06 08:49:11
【问题描述】:

为什么这不起作用?我认为该列表将能够接受任何作为 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)
    }
}

【问题讨论】:

标签: java generics


【解决方案1】:
List<? extends A> listOfAExtensions

不一样

List<A> listOfAExtensions

因为你可以分配

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

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

【讨论】:

    猜你喜欢
    • 2014-11-02
    • 2016-10-24
    • 2018-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-03
    相关资源
    最近更新 更多