Spring Batch的的ItemWriter界面是这样的:如何投射List <?延伸美孚>列出<Foo>
write(List<? extends T> items);
我想要ItemWriter调用服务,但我的服务有这样的:
process(List<T> items);
AFAIK,Java泛型是严格关于藏品中的铸造类型。
Spring Batch的的ItemWriter界面是这样的:如何投射List <?延伸美孚>列出<Foo>
write(List<? extends T> items);
我想要ItemWriter调用服务,但我的服务有这样的:
process(List<T> items);
AFAIK,Java泛型是严格关于藏品中的铸造类型。
只要继续下去,并投它。对于阅读而言,List<? extends Foo>
肯定是List<Foo>
,演员绝对安全。如果你偏执,你可以用Collections.unmodifiableList()
包装它。
List<? extends Foo> foos1 = ...;
@SuppressWarnings("unchecked")
List<Foo> foos2 = (List<Foo>)(List<?>)foos1;
如果您的服务允许? extends T
,那么这就是该类型应该是的。目前,它说什么通过必须确切地是T
。
他明确表示服务接受列表
确保您的方法接收从T继承的对象,然后执行强制转换。
或者将您的方法的签名更改为等于写入方法。
为什么我应该更改我的Spring签名?没有。 – pritam
我说过我不会改变,只是给了个建议。他可以使用给定的演员选项。 –
你就不能投,因为你知道,如果你有一个扩展Foo
它是一个Foo
一个类型?
事情是这样的:
write(List<? extends Foo> items) {
//noinspection unchecked
process((List<Foo>) items);
}
process(List<Foo> items) {
// ...
}
如果您不能100%确定这些商品是“List
这会引发Java编译器错误。因此,Q. – pritam
Java中的泛型只帮助您编译时间。您可以施放任何东西,确保该值可以为新类型施放。
List<? extends Foo> list1 = ...
List<Foo> list2 = Collections.unmodifiableList(list1);
之所以list2
必须只读视图list1
在Generics : List is same as List?
答案是很好的解释为什么你的服务有'过程(名单项目)'而不是'过程(名单 extends T>项目)'? –
ILMTitan
因为这就是我想要的。我不必坚持春天所说的。 – pritam
你为什么要那样?你是否将元素插入到项目中(通过使其成为通配符将会失去唯一的功能)? – ILMTitan