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

mak*_*aks 1 java generics casting

我有以下课程:

public class Base {
   public int someMethod(){...}
}

public class Derrived extends Base {
   @Override
   public int someMethod(){...}
}
Run Code Online (Sandbox Code Playgroud)

我也有一个返回的方法 List<Base>

List<Base> method() {
   return fetch();
}
Run Code Online (Sandbox Code Playgroud)

方法fetch()返回List<? extends Base>但实际上它包含Derrived类的实例列表

List<? extends Base> fetch() {}
Run Code Online (Sandbox Code Playgroud)

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

Jon*_*eet 6

A List<? extends Base>与a不同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);
Run Code Online (Sandbox Code Playgroud)

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