2014-02-17 102 views
0

我使用Lists.partitionGoogle Guava,雖然我有一種感覺這是關於泛型在Java中的一般問題。使用通配符與Lists.partition和嵌套泛型類型

我可以這樣做:

public void doSomething(List<DataBean> ids) { 
    List<List<DataBean>> lists = Lists.partition(ids, MAX_ITEMS); 

爲什麼我不能這樣做呢?

public void doSomething(List<? extends DataBean> ids) { 
    List<List<? extends DataBean>> lists = Lists.partition(ids, MAX_ITEMS); 

我得到以下complilation錯誤:

Type mismatch: cannot convert from List<List<capture#1-of ? extends DataBean>> to List<List<? extends DataBean>> 

回答

3

你需要使之符合整個綁定類型。否則,lists?ids?無關。你可以聲明泛型方法與命名類型參數,而不是使用通配符的通用參數:

public <T extends DataBean> void doSomething(List<T> ids) { 
    List<List<T>> lists = lists.partition(ids, MAX_ITEMS); 
} 
+0

簡單通配符時,你知道如何:-) –

+0

提出一個解決方案@馬丁威爾遜 - 是的。現在你知道如何。 :) –

2

partition方法聲明爲這種

public static <T> List<List<T>> partition(List<T> list, int size) 

因爲泛型類型的聲明變量T,該方法變爲泛型,並且類型變量捕獲使用的類型參數。您使用? extends DataBean作爲類型參數,因此據說會在T中捕獲。所以現在T真的是cap#1 of ? extends DataBean。該方法設置爲返回。換句話說,你的調用,它看起來像

public static List<List<cap#1 of ? extends DataBean>> partition(List<cap#1 of ? extends DataBean> list, int size) { 

捕獲可擴展DataBean任何類型。我們假設它是一種叫做SubBean的類型。該方法將在概念上(事實上,捕獲是真正的類型),返回一個

List<List<SubBean>> 

但是你想它的返回值賦給類型的

List<List<? extends DataBean>> 

但由於變量this,即。嵌套的泛型類型不能很好地協同工作,所以不能將List<List<SubBean>>指定爲List<List<? extends DataBean>>

由於是以前的鏈接提示,你可以在你的聲明中更改到

public void doSomething(List<? extends DataBean> ids) { 
    List<? extends List<? extends DataBean>> lists = partition(ids, 3); 
} 

但我不會使用時有solutions like Ted's.

+0

我與泰德的建議,但謝謝你的詳細答案 - 這有助於我的理解。 –

+0

@Martin不客氣。我可能也會有。我發佈了供將來參考。 –