Spring Batch的ItemWriter接口如下:
write(List<? extends T> items);
我想让 ItemWriter 调用一个服务,但我的服务有以下代码:
process(List<T> items);
据我所知,Java泛型在集合中严格限制类型转换。
Spring Batch的ItemWriter接口如下:
write(List<? extends T> items);
我想让 ItemWriter 调用一个服务,但我的服务有以下代码:
process(List<T> items);
直接强制转换即可。在读取时,List<? extends Foo>
确实是一个 List<Foo>
,转换是绝对安全的。如果你过于谨慎,可以使用 Collections.unmodifiableList()
进行包装。
List<? extends Foo> foos1 = ...;
@SuppressWarnings("unchecked")
List<Foo> foos2 = (List<Foo>)(List<?>)foos1;
确保你的方法接收一个从T继承的对象,然后执行转换操作。
或者更改你的方法签名以与写入方法相等。
List<? extends Foo> list1 = ...
List<Foo> list2 = Collections.unmodifiableList(list1);
为什么list2
必须是list1
的只读视图,这在泛型:List与List相同?的回答中有很好的解释。
? extends T
,那么类型应该是这样的。目前,它表示传入的内容必须完全是 T
。既然您知道如果有一个扩展了Foo
的类型,它就是一个Foo
,那么您为什么不可以进行强制转换呢?类似这样:
write(List<? extends Foo> items) {
//noinspection unchecked
process( (List<Foo>) items );
}
process(List<Foo> items) {
// ...
}
process(List<T> items)
而不是process(List<? extends T> items)
? - ILMTitan