2015-10-25 26 views
0

當您只知道集合的子類型時,有沒有辦法使用Collection::toArray(T[])方法?Java Collection :: toArray和子類

拿這個例子:

void initList(Collection<? extends AorB> data) { 
    JList<? extends AorB> aorb_jlist = new JList<>(); 
    aorb_jlist.setListData(data.toArray(new T<? extends AorB>[data.size()])); 
} 

abstract class AorB {} 
class A extends AorB {} 
class B extends AorB {} 

(我只是把T那裏說明,我知道,那就沒辦法了)

所有我知道的Collection是它的AorB一個子類,但它可能是。 JList接受<? extends AorB>作爲它的類型,但setListData方法需要一個數組,而Collection::toArray需要輸入。

我吠叫錯了樹toArray?有沒有一種簡單而有效的方法將此Collection轉換爲數組而無需手動迭代呢?

編輯回答@PaulBoddington:

你不能改變<? extends AorB><AorB>因爲那麼該方法將不會收到亞型的集合:

例子:

void initList(Collection<AorB> data) { 
    JList<AorB> aorb_jlist = new JList<>(); 
    aorb_jlist.setListData(data.toArray(new AorB[data.size()])); 
} 

abstract class AorB {} 
class A extends AorB {} 
class B extends AorB {} 

public static void main(String[] args) { 
    LinkedList<A> a_list = new LinkedList<>(); 
    initList(a_list); 
} 

引發錯誤:

incompatible types: LinkedList<A> cannot be converted to Collection<AorB> 
+0

你就不能使用'JList的'和一個'AorB []'? –

+0

@PaulBoddington,無論JList是使用''還是'<?擴展AorB>',你仍然必須將'Collection'轉換爲數組。你如何轉換一個'集合<?將AorB>'擴展爲數組? – ryvantage

+0

'collection.toArray(new AorB [collection.size()]);' –

回答

1

保留集合作爲Collection<? extends AorB>,但要JList中一JList<AorB>

void initList(Collection<? extends AorB> data) { 
    JList<AorB> aorb_jlist = new JList<>(); 
    aorb_jlist.setListData(data.toArray(new AorB[data.size()])); 
} 
+0

好點,當然它會產生警告:'Suspicious Collection.toArray()調用。收藏品類型?擴展AorB不可分配給數組組件類型AorB'。我可以看到這是如何工作的,但是這讓我重新評估了對在JList中使用有界通配符意味着什麼的理解。 – ryvantage