【问题标题】:Cast List to Collection要收藏的演员表
【发布时间】:2012-04-27 20:09:52
【问题描述】:

我试着用一个例子来解释这个问题。我有一个名为 X 的接口和一个实现 X 的类 Y。Y 的几个实例收集在一个列表中。现在这是我不太明白的一点。 当我尝试将此列表分配给集合时,我收到编译器错误。 否则,当我将此列表分配给集合时,它会起作用。

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

谁能解释这两个变体之间的区别以及为什么第二个不起作用。

【问题讨论】:

标签: java list collections interface casting


【解决方案1】:

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

我们看下面的代码:

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&lt;X&gt; 转换为 Collection&lt;? extends Y&gt; 的原因,这意味着该集合包含扩展 Y 但您不知道确切类型的对象。您知道可以转换为 (Y),但您不知道集合中的实际类型是什么,因此不允许使用 add() 或 addAll() 等操作。

【讨论】:

    猜你喜欢
    • 2017-09-12
    • 1970-01-01
    • 2014-12-02
    • 2012-03-20
    • 2011-07-08
    • 2012-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多