[英]How to cast List<? extends Foo> to List<Foo>
Spring Batch的ItemWriter接口是這樣的:
write(List<? extends T> items);
我想讓ItemWriter調用一個服務但我的服務有這個:
process(List<T> items);
AFAIK,Java Generics對集合中的類型轉換非常嚴格。
繼續投下吧。 對於閱讀, List<? extends Foo>
List<? extends Foo>
肯定是List<Foo>
,演員絕對安全。 如果你是偏執狂,你可以用Collections.unmodifiableList()
包裝它。
List<? extends Foo> foos1 = ...;
@SuppressWarnings("unchecked")
List<Foo> foos2 = (List<Foo>)(List<?>)foos1;
確保您的方法接收從T繼承的對象,然后執行強制轉換。
或者將方法的簽名更改為等於write方法。
List<? extends Foo> list1 = ...
List<Foo> list2 = Collections.unmodifiableList(list1);
list2
必須是list1
只讀視圖的原因在Generics的回答中得到了很好的解釋:List與List相同?
如果您的服務允許? extends T
? extends T
,那就是類型應該是什么。 目前,它說傳入的內容必須正好是T
Java中的Gennerics僅在編譯時幫助您。 您可以強制轉換任何內容,確保該值可以轉換為新類型。
難道你不能只是投出它,因為你知道如果你有一個類型擴展Foo
它是一個 Foo
?
像這樣的東西:
write(List<? extends Foo> items) {
//noinspection unchecked
process( (List<Foo>) items );
}
process(List<Foo> items) {
// ...
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.