为什么List不扩展A>接受扩展A的B的实现? [重复]

问题描述 投票:0回答:1

为什么这不起作用?我认为该列表将能够接受任何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个回答
1
投票
List<? extends A> listOfAExtensions

是不一样的

List<A> listOfAExtensions

因为你可以分配

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

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

© www.soinside.com 2019 - 2024. All rights reserved.