Spring Batch的的ItemWriter界面是這樣的:如何投射List <?延伸美孚>列出<Foo>
write(List<? extends T> items);
我想要ItemWriter調用服務,但我的服務有這樣的:
process(List<T> items);
AFAIK,Java泛型是嚴格關於藏品中的鑄造類型。
Spring Batch的的ItemWriter界面是這樣的:如何投射List <?延伸美孚>列出<Foo>
write(List<? extends T> items);
我想要ItemWriter調用服務,但我的服務有這樣的:
process(List<T> items);
AFAIK,Java泛型是嚴格關於藏品中的鑄造類型。
只要繼續下去,並投它。對於閱讀而言,List<? extends Foo>
肯定是List<Foo>
,演員絕對安全。如果你偏執,你可以用Collections.unmodifiableList()
包裝它。
List<? extends Foo> foos1 = ...;
@SuppressWarnings("unchecked")
List<Foo> foos2 = (List<Foo>)(List<?>)foos1;
如果您的服務允許? extends T
,那麼這就是該類型應該是的。目前,它說什麼通過必須確切地是T
。
他明確表示服務接受列表
確保您的方法接收從T繼承的對象,然後執行強制轉換。
或者將您的方法的簽名更改爲等於寫入方法。
爲什麼我應該更改我的Spring簽名?沒有。 – pritam
我說過我不會改變,只是給了個建議。他可以使用給定的演員選項。 –
你就不能投,因爲你知道,如果你有一個擴展Foo
它是一個Foo
一個類型?
事情是這樣的:
write(List<? extends Foo> items) {
//noinspection unchecked
process((List<Foo>) items);
}
process(List<Foo> items) {
// ...
}
如果您不能100%確定這些商品是「List
這會引發Java編譯器錯誤。因此,Q. – pritam
Java中的泛型只幫助您編譯時間。您可以施放任何東西,確保該值可以爲新類型施放。
List<? extends Foo> list1 = ...
List<Foo> list2 = Collections.unmodifiableList(list1);
之所以list2
必須只讀視圖list1
在Generics : List is same as List?
答案是很好的解釋爲什麼你的服務有'過程(名單項目)'而不是'過程(名單 extends T>項目)'? –
ILMTitan
因爲這就是我想要的。我不必堅持春天所說的。 – pritam
你爲什麼要那樣?你是否將元素插入到項目中(通過使其成爲通配符將會失去唯一的功能)? – ILMTitan