Java Collection::toArray 及其子类

标签 java generics collections toarray subtyping

有没有办法使用 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/

相关文章:

java - Spring 中的华夫饼自定义错误页面

java - 无法将 Arraylist 转换为 Double 以生成 double 组

c++ - STL 可迭代对象的迭代器循环宏

java - 使用 lambdaj 过滤集合

java - 将多个项目添加到 Java 中已初始化的数组列表

java - 如何直接从kafka主题查询?

java - java中的随机字符串条件

java - Collection 相对于 ArrayList 的优势

c# - 我怎样才能写一个通用的匿名方法?

c# - 如何将 int 值转换为等效的泛型类型参数,例如 char?