1

我有以下课程:

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>但实际上它包含 Derived 类的实例列表

List<? extends Base> fetch() {}

但是定义方法的代码method()不会编译。它需要强制转换为List<Base>. 如果我总是可以将该集合的实例视为基类的实例,为什么我需要强制转换它?

4

2 回答 2

6

AList<? extends Base>与 aList<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);

将 a 的所有现有元素List<Derived>视为 - 的实例是一回事,Base但您不能a添加BaseList<Base>,而可以将一个添加到 a List<Derived>。并非每一个List<Derived>都是 List<Base>

于 2012-05-28T15:10:15.557 回答
1

您不能这样做,因为不能保证有人不会尝试将 Base 的不同子类的对象插入到 Collection 中。

那时会发生什么?

看起来不错,但是您基本上在尝试在同一个集合中使用两种不同类型的对象,如您所知,这是不允许的。

于 2012-05-28T15:11:26.430 回答