为什么不列出<! - ?扩展A - >接受扩展A的B的实现?

时间:2018-03-06 08:49:11

标签: 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)
    }
}

1 个答案:

答案 0 :(得分:1)

List<? extends A> listOfAExtensions

不同
List<A> listOfAExtensions

因为您可以指定

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

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