2015-10-25 20 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