有没有办法使用 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()]));
}
关于Java Collection::toArray 及其子类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33325189/