我有以下课程:
public class Base {
public int someMethod(){...}
}
public class Derrived extends Base {
@Override
public int someMethod(){...}
}
我还有一个返回List<Base>
List<Base> method() {
return fetch();
}
方法fetch()
返回List<? extends Base>
但实际上它包含Derrived类的实例列表
List<? extends Base> fetch() {}
但定义方法method()
的代码将无法编译。它需要转换为List<Base>
。如果我总是可以将该集合的实例视为Base类的实例,为什么我需要强制转换呢?
答案 0 :(得分:5)
List<? extends Base>
与List<Base>
不同,就像一堆香蕉不是水果碗一样。
考虑:
List<Derived> x = new ArrayList<Derived>();
// This is valid...
List<? extends Base> y = x;
// This is what you *want* to be valid
List<Base> z = y;
z.add(new Base());
// This looks fine at compile-time... but what would you expect it to do?
Derived d = x.get(0);
将List<Derived>
的所有现有元素视为Base
的实例是一回事 - 但您不能添加 a {{ 1}}到Base
&gt;,而可以向List<Base
添加一个。不是每个List<Derived>
都是List<Derived>
。
答案 1 :(得分:1)
您无法做到这一点,因为无法保证有人不会尝试在集合中插入另一个Base的子类的对象。
那会发生什么?
它会看起来确定,但你基本上是在同一个集合中尝试使用两种不同类型的对象,正如你所知,这是不允许的。