0

ArrayListがあります。その各要素を0に設定したいと思います。現在、次のようになっています。

ArrayList <T extends Number> arr = new ArrayList();

for(int i = 0; i < some_other_array.size(); i++)
{
    arr.add(0)
}

コンパイラは次のように文句を言います

error: no suitable method found for set(int,int)
            arr.add(0);
               ^
    method ArrayList.set(int,T) is not applicable
      (actual argument int cannot be converted to T by method invocation conversion)
  where T is a type-variable:
    T extends Number
4

7 に答える 7

2

できません。のメソッドシグネチャは

 public T ArrayList<T>.set(int index, T element)

の制約Tはそれですが、それは数から構築extends Numberできるという意味ではありません。

たとえば、

class FortyTwo extends Number {
      public byteValue() { return 42; }
      public intValue()  { return 42; }
      // etc
}

初期化ルーチンがに何をすることを期待しますArrayList<FortyTwo>か?

于 2012-11-13T23:30:33.143 に答える
1

リスト宣言を次のように変更するだけです

ArrayList<Number> arr = new ArrayList<Number>();

arr何でも拡張できるようになりNumberます(これはあなたが望むものだと思います)。

今、あなたがするとき

arr.set(i, 0)

0自動ボックス化されますInteger。(自分で確認し、追加0して印刷してくださいarr.get(0) instanceof Integer。)

doubleたとえば、 sまたはsを追加する場合は、それぞれリテラルとをlong使用できます。0d0L

于 2012-11-13T23:16:34.393 に答える
0

これはあなたのケースでうまくいくはずです:arr.set(i, Integer.valueof(0));

または、この便利な標準APIを再利用できます。Collections.fill(arr, Integer.valueof(0));

于 2012-11-13T23:17:48.777 に答える
0

ArrayListの宣言を次のように変更してみてください

ArrayList<Integer> arr = new ArrayList<Integer>();

Integerクラスは自動ボクシングをサポートしていますが、Numberクラスはサポートしていません。また、このadd()方法の方が適切な場合もあります。

于 2012-11-13T23:24:25.563 に答える
0

値を0に設定する理由は、ArrayListオブジェクトがインスタンス化されるため、自動的にゼロになります。そのため、その時点でサイズがゼロになり、ループが実行されないため、コードは役に立ちません。

于 2012-11-13T23:27:11.390 に答える
0

ArrayListさて、あなたは実際にどのように機能するかについて少し混乱していると思います。を作成するArrayListと、常に空になります。サイズを指定した場合でも:

ArrayList<Integer> arr = new ArrayList<Integer>(20);

これ20は、「開始要素数」ではなく、単に「初期容量」を意味します。結果として、set要素がないため、は機能しません。このようにコンパイラの問題を修正したとしても、次のようになります。

arr.set(i, Integer.valueOf(0));

またはこのように:

ArrayList<Number> arr = new ArrayList<Number>();

arr.size()がゼロであるため、何forも実行されないため、ループは実行されません。

ここで重要なのは、実際の配列でArrayList はないということです。配列をラップし、要素が多すぎる場合は内部配列を展開します。言い換えれば、私はこれを行うことはできません:

ArrayList<Integer> arr = new ArrayList<Integer>(20);
arr.get(0); // Throws an out of bounds exception

そうは言っても、で20個のゼロから始めたい場合は、ループでArrayListこのメソッドを使用できます。代わりに、次のようにします。addi < 20

for(int i = 0; i < 20; i++) {
    arr.add(Integer.valueOf(0));
}

これにより、に20個のゼロが追加されarrます。エラーを修正した後でも、コードは修正されません。

于 2012-11-13T23:30:25.237 に答える
-1

これを試すことができます(私の知る限り、プリミティブ型をArrayListに追加することはできません)。

ArrayList<Integer> arr = new ArrayList<Integer>();

for(int i = 0; i < someNumber; i++)
{
   arr.add(0);
}

サイズが0の場合、デフォルト値がなく、容量が確認する必要があることに注意してください(容量はコンストラクターで設定できます)。

于 2012-11-13T23:15:09.807 に答える