这个问题在这里已有答案:
为什么这不起作用?我认为该列表将能够接受任何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
是与A
无关的BImpl
的实现。如果你可以在之后添加一个BImpl
到listOfExtensions
,你会在一个无关的BImpl
列表中添加一个CImpl
,这是没有意义的。因此,编译器不允许您将BImpl
的实例添加到listOfAExtensions
。