【问题标题】:The method toArray(T[]) in the type ArrayList<Boolean> is not applicable for the arguments (boolean[])ArrayList<Boolean> 类型中的方法 toArray(T[]) 不适用于参数 (boolean[])
【发布时间】:2013-03-20 21:10:56
【问题描述】:

我写了一个函数来获取boolean数组,从arraylist&lt;boolean&gt;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 数组呢?

【问题讨论】:

  • 当 Boolean[] 可以以相同的方式工作时,为什么还需要 boolean[]?
  • @Sudhanshu 因为我有其他功能public String BoolToStr(boolean[] input)访问需要布尔[]

标签: java arrays arraylist


【解决方案1】:

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

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

没有办法使用泛型获得原始booleans 的数组,并且自动装箱或强制转换不适用于数组(例如,不可能将原始类型的数组分配给包装类型的数组,反之亦然)。获得你想要的数组的唯一方法是用循环来做这件事:

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++。

【讨论】:

  • 如何使用 Java 8 map 获得 nop[n] 一样?,无法访问索引。
【解决方案2】:

如果您真的想要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 中泛型不适用于基元。它仅适用于引用类型(即对象)。

【讨论】:

    【解决方案3】:
    int index = 0;
    boolean[] array = new boolean[fool.size()];
    for (Boolean value: fool) {
      array[index++] = value;
    }
    

    【讨论】:

    • 请不要只输入代码 sn-p 作为您的答案,还要添加一些细节/解释
    猜你喜欢
    • 1970-01-01
    • 2013-09-18
    • 2014-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-23
    相关资源
    最近更新 更多