在return语句中使用泛型中的转换

时间:2012-05-28 15:07:29

标签: java generics casting

我有以下课程:

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类的实例,为什么我需要强制转换呢?

2 个答案:

答案 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的子类的对象。

那会发生什么?

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