次のようにArrayListを初期化できる理由:
ArrayList<Integer> x = new ArrayList<Integer>(Arrays.asList(1,2));
しかし、使用時にエラーが発生しました:
ArrayList<Long> x = new ArrayList<Long>(Arrays.asList(1,2));
Javaは、必要に応じてint
をlong
に自動的に変換します。
ただし、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)
を使用する場合、E
はInteger
型の何かであると想定されます。したがって、_List<Integer>
_は入力として機能します。
ただし、new ArrayList<Long>(List<E> list)
を使用する場合、明らかにE
はLong
型である必要があります。ただし、オブジェクトInteger
はnot of typeLong
であるため、not acceptパラメーターです。 Integer
およびLong
の最初の共通タイプは、抽象クラスNumber
(Double
、Float
なども保持します)( ドキュメント )。
そのため、入力_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
_
これは、_1
_と_2
_がintであり、Arrays.asList(1, 2)
が_List<Integer>
_を作成するためです。
また、ArrayList
のコピーコンストラクターでは、引数が同じジェネリック型である必要があります。
いくつかのオプションがありますが、最も簡単な方法は、int
接尾辞を追加してlong
sをL
sに変更することです。
_List<Long> x = new ArrayList<Long>(Arrays.asList(1L, 2L));
_
Java 9では、次のように書くこともできます。
_List<Long> x = List.of(1L, 2L);
_
リテラルLong
またはl
を使用してL
番号を指定する必要があります。
ArrayList<Long> x = new ArrayList<Long>(Arrays.asList(1L, 2L));
Arrays.asList(1,2)
は暗黙的にList<Integer>
を返すためです。
これを修正するには、次のイディオムを使用します。
ArrayList<Long> x = new ArrayList<Long>(Arrays.asList(1l,2l));