2011-10-14 69 views
9

Spring Batch的的ItemWriter界面是這樣的:如何投射List <?延伸美孚>列出<Foo>

write(List<? extends T> items); 

我想要ItemWriter調用服務,但我的服務有這樣的:

process(List<T> items); 

AFAIK,Java泛型是嚴格關於​​藏品中的鑄造類型。

+0

答案是很好的解釋爲什麼你的服務有'過程(名單項目)'而不是'過程(名單項目)'? – ILMTitan

+1

因爲這就是我想要的。我不必堅持春天所說的。 – pritam

+0

你爲什麼要那樣?你是否將元素插入到項目中(通過使其成爲通配符將會失去唯一的功能)? – ILMTitan

回答

9

只要繼續下去,並投它。對於閱讀而言,List<? extends Foo>肯定是List<Foo>,演員絕對安全。如果你偏執,你可以用Collections.unmodifiableList()包裝它。

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

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

輝煌。你是上帝> PS:注意爲什麼Java泛型SUCK。 – pritam

+3

爲什麼額外(列表)投了? –

+0

這不起作用 –

2

如果您的服務允許? extends T,那麼這就是該類型應該是的。目前,它說什麼通過必須確切地是T

+0

他明確表示服務接受列表,而不是列表。 –

7

確保您的方法接收從T繼承的對象,然後執行強制轉換。

或者將您的方法的簽名更改爲等於寫入方法。

+0

爲什麼我應該更改我的Spring簽名?沒有。 – pritam

+1

我說過我不會改變,只是給了個建議。他可以使用給定的演員選項。 –

0

你就不能投,因爲你知道,如果你有一個擴展Foo是一個Foo一個類型?
事情是這樣的:

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

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

如果您不能100%確定這些商品是「List '類型,請務必抓住潛在的例外情況。 –

+0

這會引發Java編譯器錯誤。因此,Q. – pritam

1

Java中的泛型只幫助您編譯時間。您可以施放任何東西,確保該值可以爲新類型施放。

相關問題