我尝试在一个例子中解释这个问题。我有一个名为X的接口(interface),我有一个实现X的类Y。在List中收集了Y的几个实例。现在这是我不太了解的要点。
当我尝试将此列表分配给集合时,出现编译器错误。
否则,当我将此列表分配给集合时,它将起作用。

List<Y> yList = new ArrayList<Y>();
// works
Collection<? extends X> coll1 = yList;
// error
Collection<X> coll2 = yList;

任何人都可以解释这两个变体之间的区别是什么,以及为什么第二个变体不起作用。

最佳答案

为此,您需要更多地了解泛型的概念。

让我们看下面的代码:

List<Integer> ints = new ArrayList<Integer>();
ints.add(Integer.valueOf(1));
List<Number> numbers = ints;// This does not compile! and you will now see why:

numbers.add(new Double(2.3d));// This is valid
Integer i = ints.get(1); // This would be broken then because I expect an Integer but get a Double

这就是为什么需要将List<X>转换为Collection<? extends Y>的原因,这意味着集合包含扩展Y的对象,但您不知道确切的类型。您知道可以强制转换为(Y),但您不知道集合中的实际类型是什么,因此,不允许执行add()或addAll()之类的操作。

08-16 03:14