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

cha*_*nyi 3 java arrays arraylist

我编写了一个函数来获取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()]);
Run Code Online (Sandbox Code Playgroud)

如果我改变的类型boolean[]opBoolean[]op,那是工作,但我需要boolean[]..

那我该如何获得boolean阵列呢?

App*_*ish 6

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

Boolean[] op = fool.toArray(new Boolean[fool.size()]);
Run Code Online (Sandbox Code Playgroud)

没有办法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); 
}
Run Code Online (Sandbox Code Playgroud)

使用mapJava 8中的构造可以更加优雅地实现这一点.

从个人的角度来看,泛型不适用于原语的事实是关于java的少数事情之一,这真的让我感到沮丧.我不打算与设计师争论,但是为了对不同类型的数组做同样的事情而不得不编写七个不同的函数似乎无视首先在语言中添加泛型特性的全部意义.只需看看java.util.Arrays类 ; 必须编写这种代码足以让我想切换到C++.