Java Collection::toArray 有子类

Java Collection::toArray with subclasses

当你只知道集合的子类型时,有没有办法使用Collection::toArray(T[])方法?

举个例子:

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>

将集合保留为 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()]));
}