如何将List扩展Foo>到List

问题描述 投票:12回答:6

Spring Batch的ItemWriter界面是这样的:

write(List<? extends T> items); 

我想让ItemWriter调用一个服务但我的服务有这个:

process(List<T> items); 

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

java spring-batch
6个回答
10
投票

继续投下吧。为了阅读,List<? extends Foo>肯定是一个List<Foo>,演员是绝对安全的。如果你是偏执狂,你可以用Collections.unmodifiableList()包裹它。

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

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

7
投票

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

或者将方法的签名更改为等于write方法。


3
投票
List<? extends Foo> list1 = ...
List<Foo> list2 = Collections.unmodifiableList(list1);

为什么list2必须是list1的只读视图的原因很好地解释了Generics : List is same as List?的答案


2
投票

如果您的服务允许? extends T,那么这就是类型应该是什么。目前,它说传入的内容必须正是T


1
投票

Java中的泛型仅在编译时帮助您。您可以强制转换任何内容,确保该值可以转换为新类型。


0
投票

难道你不能只是施展它,因为你知道如果你有一个类型延伸Foo它是一个Foo? 像这样的东西:

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

process(List<Foo> items) {
    // ...
}
© www.soinside.com 2019 - 2024. All rights reserved.