web-dev-qa-db-ja.com

JavaのArrayList問題への可変引数

次が機能しない理由がわかりません。

public void doSomething(int... args){
  List<Integer> broken = new ArrayList<Integer>(Arrays.asList(args))
}

コンパイラが「int ... args」を配列に変換するので、上記のコードは機能するはずです。

働く代わりに私は得る:

シンボルsymbolが見つかりません:コンストラクターArrayList(Java.util.List<int[]>)location:クラスJava.util.ArrayList<Java.lang.Integer>

それは奇妙です。配列リストに配列を追加するのではなく、リストの各要素を配列リストに追加します。どうしたの?

34
Ben B.

できるよ

public void doSomething(int... args){
    List<Integer> ints = new ArrayList<Integer>(args.length);
    for(int i: args) ints.add(i);
}

または

public void doSomething(Integer... args){
    List<Integer> ints = Arrays.asList(args);
}
17
Peter Lawrey

この場合、オートボクシング(intからIntegerへの自動変換)は機能しません。各intをリストに手動で追加する必要があります。

そのようなコードが頻繁に必要な場合は、 commons langorg.Apache.commons.lang.ArrayUtils.toObject(int[])を使用することを検討してください

7
Aaron Digulla

Guavaを使用してこれを解決できます。

List<Integer> broken = new ArrayList<>(Ints.asList(args))

またはストリームで:

List<Integer> broken = Arrays
    .stream(array)
    .boxed()
    .collect(Collectors.toCollection(ArrayList::new));
3
ZhekaKozlov