web-dev-qa-db-ja.com

ArrayList <Long>の初期化

次のようにArrayListを初期化できる理由:

ArrayList<Integer> x = new ArrayList<Integer>(Arrays.asList(1,2));

しかし、使用時にエラーが発生しました:

ArrayList<Long> x = new ArrayList<Long>(Arrays.asList(1,2));
5
Luke

説明

Javaは、必要に応じてintlongに自動的に変換します。

ただし、Java 同じことをしないIntegerからLongへの変換が必要な場合。

関数Arrays.asList(...)は、Eがパラメーターとして使用されるタイプである_List<E>_を返します。 _1, 2, 3_を使用すると、タイプはintになります。ただし、data-types as _List<int>_の一般的な使用はJava(少なくとも現在)では不可能です。したがって、intを自動的に変換します。 to Integerを生成し、_List<Integer>_オブジェクトを生成します。このプロセスはauto-boxing、Javaはすべてのデータ型に対してこれを行うことができます対応するオブジェクト表現。

コンストラクタnew ArrayList<Integer>(List<E> list)を使用する場合、EInteger型の何かであると想定されます。したがって、_List<Integer>_は入力として機能します。

ただし、new ArrayList<Long>(List<E> list)を使用する場合、明らかにELong型である必要があります。ただし、オブジェクトIntegernot of typeLongであるため、not acceptパラメーターです。 IntegerおよびLongの最初の共通タイプは、抽象クラスNumberDoubleFloatなども保持します)( ドキュメント )。


解決

そのため、入力_1, 2, 3_がintではなくlongとして解釈されることを中心に展開します。これを修正するにはexplicitly telling Java to interpret as number as long、you'm append by lまたはL番号の後:

_new ArrayList<Long>(Arrays.asList(1L, 2L, 3L));
_

これで、_List<Long>_を受け取り、それが_ArrayList<Long>_に追加されます。


同じ手法を使用して、10進数をfloatの代わりにdoubleとして明示的に解釈できることに注意してください:_1.5F_または_1.5f_

17
Zabuza

これは、_1_と_2_がintであり、Arrays.asList(1, 2)が_List<Integer>_を作成するためです。

また、ArrayListのコピーコンストラクターでは、引数が同じジェネリック型である必要があります。

いくつかのオプションがありますが、最も簡単な方法は、int接尾辞を追加してlongsをLsに変更することです。

_List<Long> x = new ArrayList<Long>(Arrays.asList(1L, 2L));
_

Java 9では、次のように書くこともできます。

_List<Long> x = List.of(1L, 2L);
_
12
assylias

リテラルLongまたはlを使用してL番号を指定する必要があります。

ArrayList<Long> x = new ArrayList<Long>(Arrays.asList(1L, 2L));
7
Nikolas

Arrays.asList(1,2)は暗黙的にList<Integer>を返すためです。

これを修正するには、次のイディオムを使用します。

ArrayList<Long> x = new ArrayList<Long>(Arrays.asList(1l,2l));
4
Mena