我编写了一个函数来获取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
数组?
答案 0 :(得分:5)
原始类型不能用于泛型。为了使数组与T[]
的类型签名匹配,您必须使用Boolean
包装类,就像在ArrayList的声明中一样,即使您不希望最终数组是那种类型:
Boolean[] op = fool.toArray(new Boolean[fool.size()]);
无法使用泛型获取原始boolean
数组,并且自动装箱或转换不适用于数组(例如,无法将基本类型的数组分配给包装类型的数组和副本-versa)。获得所需数组的唯一方法是使用循环:
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 class;必须编写这种代码就足以让我想切换到C ++。
答案 1 :(得分:4)
如果你真的想要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泛型不适用于基元。它仅适用于引用类型(即对象)。
答案 2 :(得分:0)
int index = 0;
boolean[] array = new boolean[fool.size()];
for (Boolean value: fool) {
array[index++] = value;
}