Java 如何转换列表<;?扩展Foo>;列出<;Foo>;

Java 如何转换列表<;?扩展Foo>;列出<;Foo>;,java,spring-batch,Java,Spring Batch,Spring Batch的界面如下所示: write(List<? extends T> items); write(List如果您的服务允许?扩展T,那么这就是类型应该是什么。目前,它说传入的内容必须完全是T确保您的方法接收到从T继承的对象,然后执行强制转换 或者将方法的签名更改为与write方法相同。您不能强制转换它,因为您知道如果您有一个扩展了Foo的类型,那么它就是Foo? 大概是这样的: write(List<? extends Foo> items) {

Spring Batch的界面如下所示:

write(List<? extends T> items); 

write(List如果您的服务允许
?扩展T
,那么这就是类型应该是什么。目前,它说传入的内容必须完全是
T

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


或者将方法的签名更改为与write方法相同。

您不能强制转换它,因为您知道如果您有一个扩展了
Foo
的类型,那么它就是
Foo

大概是这样的:

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

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

写入(List继续并强制转换它。阅读时,
ListJava Gennerics仅在编译时间内对您有所帮助。您可以强制转换任何内容,确保新类型的值是可强制转换的。

列表如果您不能100%确定项目是
List
类型,请务必捕获潜在的异常。您的服务为什么有
>处理(列表项)
而不是
处理(列表项),因为这是我想要的。我不必遵守Spring所说的。为什么要这样做?是否将元素插入到项中(将其设为通配符会丢失的唯一功能)?作为一项服务,签名是干净的、声明性的,而不是通配符,服务不需要通配符。(是的,但对其他情况有用)。为什么我要更改Spring的签名?不。我说我不想更改,只是给出了一个建议。他可以使用给定的强制转换选项。太棒了。You is GOD>PS:注意Java泛型为什么很糟糕。为什么额外的(列表)强制转换?他明确表示服务接受列表,而不是列表
write(List<? extends Foo> items) {
    //noinspection unchecked
    process( (List<Foo>) items );
}

process(List<Foo> items) {
    // ...
}
List<? extends Foo> foos1 = ...;

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