私は質問を見ました: Create ArrayList from array
ただし、次のコードでこのソリューションを試しても、すべての場合にうまく機能しません。
_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));
はうまくコンパイルすべきではありませんか?
の問題
intList = new ArrayList<Integer>(Arrays.asList(intArray));
プリミティブ配列がObject
から拡張されるため、int[]
は単一のObject
インスタンスと見なされます。これは、Object
の配列を送信しているので、Integer[]
の代わりにint[]
がある場合に機能します。
Integer[] intArray = new Integer[] { 0, 1 };
//now you're sending a Object array
intList = new ArrayList<Integer>(Arrays.asList(intArray));
コメントから:int[]
(または別のプリミティブ型配列)をメインデータとして使用したい場合は、ラッパークラスで追加の配列を作成する必要があります。この例では:
int[] intArray = new int[] { 0, 1 };
Integer[] integerArray = new Integer[intArray.length];
int i = 0;
for(int intValue : intArray) {
integerArray[i++] = intValue;
}
intList = new ArrayList<Integer>(Arrays.asList(integerArray));
ただし、既にfor
ループを使用しているので、一時ラッパークラス配列を使用してもかまいません。リストにアイテムを直接追加するだけです。
int[] intArray = new int[] { 0, 1 };
intList = new ArrayList<Integer>();
for(int intValue : intArray) {
intList.add(intValue);
}
Java 8を使用すると、1行で実行できます。
int [] intArr = {1、1、2、3、5、8、11}; List <Integer> list = Arrays.stream(intArr).boxed()。collect(Collectors.toList()); list.forEach(System.out :: println);
int[]
の代わりにInteger[]
を使用しているため、機能しません。これを試して:
Integer[] intArray = new Integer[] { 0, 1 };
// this should work now
intList = new ArrayList<Integer>(Arrays.asList(intArray));
問題はオートボクシングに関するものです。 Java自動的にint
をInteger
に自動的に変換しますが、int[]
をInteger[]
に変換しません。
public static <T> List<T> asList(T... a)
asList
は上記のように定義されます。タイプT
の可変引数が必要です。つまり、T
型のオブジェクトの配列を取ることができます。あなたの場合、Javaはint[]
をInteger[]
に変換できないため、T
ではなくint[]
としてタイプInteger
を取ります。したがって、List<int[]
タイプのリストを取得します。手動で`Integer[]
からint[]
に変換する必要があります
Joshua Blochの本Effective Java
には、可変引数を使用してピットを説明する優れたアイテムがあり、これもその1つです。
コレクションはオブジェクトを必要とし、プリミティブはオブジェクトから派生しません。 Integer
は許可しますが、int
は許可しません。
したがって、プリミティブ型であるInteger
の代わりにラッパークラスint
を使用する必要があります。
例:
Integer[] intArray = new Integer[] { 0, 1 };
intList = new ArrayList<Integer>(Arrays.asList(intArray));