29

質問を見てきました:配列から ArrayList を作成する

ただし、次のコードでそのソリューションを試してみると、すべての場合でうまく機能しません。

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;

public class ToArrayList {

    public static void main(String[] args) {
        // this works
        String[] elements = new String[] { "Ryan", "Julie", "Bob" };
        List<String> list = new ArrayList<String>(Arrays.asList(elements));
        System.out.println(list);

        // this works
        List<Integer> intList = null;
        intList = Arrays.asList(3, 5);
        System.out.println(intList);

        int[] intArray = new int[] { 0, 1 };
        // this doesn't work!
        intList = new ArrayList<Integer>(Arrays.asList(intArray));
        System.out.println(intList);
    }
}

ここで何が間違っていますか?intList = new ArrayList<Integer>(Arrays.asList(intArray));コードは正常にコンパイルされるべきではありませんか?

4

5 に答える 5

8

問題はオートボクシングに関するものです。Java は自動的に に自動的に変換intされますが、 には変換されIntegerません。したがって、理由。int[]Integer[]

public static <T> List<T> asList(T... a)

asList上記のように定義されています。type の vararg が必要ですT。つまり、 型のオブジェクトの配列を取ることができますT。あなたの場合、Javaはに変換できないためint[]、必要に応じInteger[]て型Tint[]取得Integerします。したがって、 type のリストを取得しますList<int[]`Integer[]から手動で変換する必要があります。int[]

Effective JavaJoshua Bloch の本には、varargs を使用したピットについて説明している優れた項目があり、これはその 1 つです。

于 2013-07-08T08:25:36.167 に答える
7

int[]の代わりに を使用しているため、機能しませんInteger[]。これを試して:

Integer[] intArray = new Integer[] { 0, 1 };
// this should work now
intList = new ArrayList<Integer>(Arrays.asList(intArray));
于 2013-07-08T07:17:50.300 に答える
3

コレクションはオブジェクトを必要とし、プリミティブはオブジェクトから派生しません。Integer許可しますが、許可しintません。

したがって、プリミティブ型Integerの代わりにラッパー クラスを使用する必要があります。int

例:

 Integer[] intArray = new Integer[] { 0, 1 };
 intList = new ArrayList<Integer>(Arrays.asList(intArray));
于 2013-07-08T07:21:29.240 に答える