我试着用一个例子来解释这个问题。我有一个名为 X 的接口和一个实现 X 的类 Y。Y 的几个实例收集在一个列表中。现在这是我不太明白的一点。当我尝试将此列表分配给集合时,我收到编译器错误。否则,当我将此列表分配给集合时,它会起作用。
List<Y> yList = new ArrayList<Y>();
// works
Collection<? extends X> coll1 = yList;
// error
Collection<X> coll2 = yList;
谁能解释这两个变体之间的区别以及为什么第二个变体不起作用。