如何投射List <! - ?将Foo - >扩展到List <foo> </foo>

时间:2011-10-14 20:26:01

标签: java spring-batch

Spring Batch的ItemWriter接口是这样的:

write(List<? extends T> items); 

我希望ItemWriter调用服务,但我的服务有:

process(List<T> items); 

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

6 个答案:

答案 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) {
    // ...
}