2011-10-14 40 views
9

Spring Batch的的ItemWriter界面是这样的:如何投射List <?延伸美孚>列出<Foo>

write(List<? extends T> items); 

我想要ItemWriter调用服务,但我的服务有这样的:

process(List<T> items); 

AFAIK,Java泛型是严格关于​​藏品中的铸造类型。

+0

答案是很好的解释为什么你的服务有'过程(名单项目)'而不是'过程(名单项目)'? – ILMTitan

+1

因为这就是我想要的。我不必坚持春天所说的。 – pritam

+0

你为什么要那样?你是否将元素插入到项目中(通过使其成为通配符将会失去唯一的功能)? – ILMTitan

回答

9

只要继续下去,并投它。对于阅读而言,List<? extends Foo>肯定是List<Foo>,演员绝对安全。如果你偏执,你可以用Collections.unmodifiableList()包装它。

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

@SuppressWarnings("unchecked") 
List<Foo> foos2 = (List<Foo>)(List<?>)foos1;  
+1

辉煌。你是上帝> PS:注意为什么Java泛型SUCK。 – pritam

+3

为什么额外(列表)投了? –

+0

这不起作用 –

2

如果您的服务允许? extends T,那么这就是该类型应该是的。目前,它说什么通过必须确切地是T

+0

他明确表示服务接受列表,而不是列表。 –

7

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

或者将您的方法的签名更改为等于写入方法。

+0

为什么我应该更改我的Spring签名?没有。 – pritam

+1

我说过我不会改变,只是给了个建议。他可以使用给定的演员选项。 –

0

你就不能投,因为你知道,如果你有一个扩展Foo是一个Foo一个类型?
事情是这样的:

write(List<? extends Foo> items) { 
    //noinspection unchecked 
    process((List<Foo>) items); 
} 

process(List<Foo> items) { 
    // ... 
} 
+0

如果您不能100%确定这些商品是“List '类型,请务必抓住潜在的例外情况。 –

+0

这会引发Java编译器错误。因此,Q. – pritam

1

Java中的泛型只帮助您编译时间。您可以施放任何东西,确保该值可以为新类型施放。

相关问题