如何投射List <?将Foo>扩展到List <Foo>

pri*_*pri 13 java spring-batch

Spring Batch的ItemWriter接口是这样的:

write(List<? extends T> items); 
Run Code Online (Sandbox Code Playgroud)

我想让ItemWriter调用一个服务但我的服务有这个:

process(List<T> items); 
Run Code Online (Sandbox Code Playgroud)

AFAIK,Java Generics对集合中的类型转换非常严格.

irr*_*ble 12

继续投下吧.对于阅读,List<? extends Foo>肯定是一个List<Foo>,演员是绝对安全的.Collections.unmodifiableList()如果你是偏执狂,你可以用它包裹它.

List<? extends Foo> foos1 = ...;

@SuppressWarnings("unchecked")
List<Foo> foos2 = (List<Foo>)(List<?>)foos1;    
Run Code Online (Sandbox Code Playgroud)

  • 为什么额外(List <?>)演员? (4认同)
  • 杰出的。你是上帝&gt; PS:注意为什么 Java 泛型很烂。 (2认同)

小智 7

确保您的方法接收从T继承的对象,然后执行强制转换.

或者将方法的签名更改为等于write方法.


cze*_*rny 5

List<? extends Foo> list1 = ...
List<Foo> list2 = Collections.unmodifiableList(list1);
Run Code Online (Sandbox Code Playgroud)

为什么list2必须是只读视图的原因list1在泛型的答案中得到了很好的解释:列表与列表相同?