簡體   English   中英

如何投射List <? extends Foo> 列表 <Foo>

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM