0

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>
4

1 回答 1

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()]));
}
于 2015-10-25T21:06:05.750 回答