16

簡単なプログラムを実行しているときに、この問題に気づきました。

int[] example = new int[10];
List<Integer> exampleList = Arrays.asList(example);// Compilation error here  

コンパイルエラーはとして返されcannot convert from List<int[]> to List<Integer>ます。しかしList<int>、Javaでは許可されていないのに、なぜこの種のコンパイルエラーが発生するのでしょうか。

私はここでオートボクシングについて質問していません。どうすれArrays.asListば戻ることができるのか疑問に思いましたList<int[]>

asListの実装は

public static <T> List<T> asList(T... a) {
return new ArrayList<T>(a);
}

したがって、int []をTとして扱っているため、これが発生しています。

4

4 に答える 4

12

の基になるintの自動オートボクシングは行われませんArrays.asList

  • int[]は実際にはオブジェクトであり、プリミティブではありません。

  • ここでをArrays.asList(example)返しますList<int[]>List<int>確かに無効な構文です。

  • あなたが使用することができます:

    List <Integer> exampleList = Arrays.asList(ArrayUtils.toObject(array));

    ApacheCommonsを使用しArrayUtilsます。

于 2012-08-18T17:53:29.223 に答える
2

Arrays.asList(...)オブジェクトの配列をそれらのオブジェクトのリストに変換するために完全に機能します。

また、Arrays.asList(...)Java 5ではvarag構文を使用して定義されています。つまり、未定義の数のパラメーターを受け入れることができます。その場合、これらのパラメーターはすべて配列のメンバーと見なされ、Listそれらの要素を含むインスタンスが返されます。

List<Object> objList = Arrays.asList(obj1, obj2, obj3);

つまり、単一の要素でリストを作成できます。

List<Object> objList = Arrays.asList(obj1);

List<int>Javaでは許可されていないため、配列をパラメーターとして使用するとint[]Arrays.asList配列ではなくリストの単一要素と見なされますint。これは、配列はJavaではそれ自体がオブジェクトであるのに対し、int(およびその他のプリミティブ)はそうではないためです。

したがって、プリミティブの配列を変換するときはArrays.asList、プリミティブ配列のリストを返そうとします。

List<int[]> intArrayList = Arrays.asList(new int[]{ 1, 2, 3 });
于 2012-08-18T18:04:50.663 に答える
2

シグニチャ<T> List<T> asList(T... os)にはジェネリック型が含まれTます。ジェネリック型の範囲は、参照型(配列型を含む)のみを対象とし、プリミティブ型は対象外です。したがって、を使用した呼び出しArrays.asList(ints)int[] intsは、にTしか解決できませんint[]

より高いレベルでは、目的は配列のリストビューArrays.asListを提供することです。これは、配列が変更されないままであり、その要素がを実装するオブジェクトを通じて利用可能になることを意味します。ただし、sにはオブジェクトのみを含めることができ、配列にはプリミティブsを含めることができます。そのため、アレイはインターフェイスを介して公開されません。ListListintList

とにかく、リストを作成するための洗練された構文を探している場合はIntegers、と書いてArrays.asList(1,2,3)ください。

于 2012-08-18T19:36:41.357 に答える
1

配列はJavaのオブジェクトであり、プリミティブ型ではありません。List<int[]>ではなく、(int-arraysのリスト)と表示されていることに注意してくださいList<int>

于 2012-08-18T18:02:17.753 に答える