繁体   English   中英

ArrayList 类型中的 toArray(T[]) 方法<Boolean>不适用于参数 (boolean[])

[英]The method toArray(T[]) in the type ArrayList<Boolean> is not applicable for the arguments (boolean[])

我编写了一个函数来获取boolean数组,从arraylist<boolean>boolean数组,但出现错误:

ArrayList 类型中的 toArray(T[]) 方法不适用于参数 (boolean[])

ArrayList<Boolean> fool = new ArrayList<Boolean>();

for (int i = 0; i < o.length(); i++) {
    if (Integer.parseInt(o.substring(i, i + 1)) == 1) {
        fool.add(true);
    } else {
        fool.add(false);
    }
}

boolean[] op = fool.toArray(new boolean[fool.size()]);

如果我将类型boolean[]op更改为Boolean[]op ,那是可行的,但我需要boolean[] ..

那么我怎样才能得到boolean数组呢?

不能在泛型中使用原始类型。 为了使数组匹配T[]的类型签名,您必须像在 ArrayList 的声明中一样使用Boolean包装类,即使您不希望最终数组为该类型:

Boolean[] op = fool.toArray(new Boolean[fool.size()]);

无法使用泛型获取原始boolean数组,并且自动装箱或强制转换不适用于数组(例如,不可能将原始类型的数组分配给包装类型的数组,反之亦然)。 获得您想要的数组的唯一方法是使用循环以艰难的方式进行:

boolean[] op = new boolean[fool.size()];

for(int n = 0; n < temp.length; n++)
{
     //autoboxing implicitly converts Boolean to boolean
     op[n] = fool.get(n); 
}

这可能可以使用 Java 8 中的map结构更优雅地完成。

就个人而言,泛型不适用于基元这一事实是 Java 中为数不多的真正让我感到沮丧的事情之一。 我不会与设计者争论,但是必须编写七个不同的函数来对不同类型的数组做同样的事情,这似乎无视首先向语言添加泛型特性的全部意义。 看看java.util.Arrays 类 不得不写这种代码就足以让我想切换到 C++。

如果您真的想要boolean[]则不需要填充列表并最终将列表转换为数组。 只需执行以下操作:

boolean[] bools = new boolean[o.length()];
for (int i = 0; i < o.length(); i++) {
    bools[i] = Integer.parseInt(o.substring(i,i+1)) == 1;
}

注意: fool.toArray(new boolean[fool.size()])不起作用的事实是因为该方法是泛型方法,并且在 Java 中泛型不适用于基元。 它仅适用于引用类型(即对象)。

int index = 0;
boolean[] array = new boolean[fool.size()];
for (Boolean value: fool) {
  array[index++] = value;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM