Spring Batch的ItemWriter接口是这样的:
write(List<? extends T> items);
我希望ItemWriter调用服务,但我的服务有:
process(List<T> items);
AFAIK,Java Generics对集合中的类型转换非常严格。
答案 0 :(得分:10)
继续投下它。对于阅读,List<? extends Foo>
肯定是List<Foo>
,演员绝对安全。如果你是偏执狂,你可以用Collections.unmodifiableList()
包裹它。
List<? extends Foo> foos1 = ...;
@SuppressWarnings("unchecked")
List<Foo> foos2 = (List<Foo>)(List<?>)foos1;
答案 1 :(得分:7)
确保您的方法接收一个继承自T的对象,然后执行强制转换。
或者将方法的签名更改为等于write方法。
答案 2 :(得分:3)
List<? extends Foo> list1 = ...
List<Foo> list2 = Collections.unmodifiableList(list1);
在Generics : List is same as List?
的回答中很好地解释了list2
必须是list1
的只读视图的原因
答案 3 :(得分:2)
如果您的服务允许? extends T
,那么该类型应该是什么。目前,它表示传入的内容必须正好T
。
答案 4 :(得分:1)
Java中的泛型仅在编译时帮助您。您可以强制转换任何内容,确保该值可以转换为新类型。
答案 5 :(得分:0)
你不能只是投了它,因为你知道如果你有一个扩展Foo
的类型是 Foo
吗?
像这样:
write(List<? extends Foo> items) {
//noinspection unchecked
process( (List<Foo>) items );
}
process(List<Foo> items) {
// ...
}