4

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配列を取得できますか?

4

3 に答える 3

6

プリミティブ型はジェネリックでは使用できません。配列を の型シグネチャと一致させるには、最終的な配列をその型にしたくない場合でも、ArrayList の宣言で行ったのと同じようにラッパー クラスをT[]使用する必要があります。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); 
}

mapこれは、Java 8のコンストラクトを使用して、より洗練された方法で実現できる可能性があります。

個人的には、ジェネリックがプリミティブに対して機能しないという事実は、Java に関して正直なところ本当にイライラする数少ないことの 1 つです。設計者と議論するつもりはありませんが、異なる型の配列に対して同じことを行うためだけに 7 つの異なる関数を書かなければならないということは、言語にジェネリック機能を最初に追加するという全体の要点に反しているように思えます。java.util.Arrays クラスを見てください。この種のコードを書かなければならないだけで、私は C++ に切り替えたくなります。

于 2013-03-30T06:17:33.173 に答える
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 ジェネリックではプリミティブに対して機能しないためです。参照型 (つまり、オブジェクト) に対してのみ機能します。

于 2013-03-30T06:17:41.013 に答える
0
int index = 0;
boolean[] array = new boolean[fool.size()];
for (Boolean value: fool) {
  array[index++] = value;
}
于 2021-01-11T16:57:37.457 に答える