リストを Long 型に設定しても、エラーなく実行できます。知っておくべき潜在的な問題はありますか?
long num = 12L;
List<Long> list = new ArrayList<Long>();
list.add(num)
いいえ。プリミティブ long は、自動的に Long にボックス化されます。
問題を引き起こす可能性があるのは、逆の操作です。
long foo = list.get(0);
これにより、Long が long にアンボックスされ、null がリストに格納されている場合は NullPointerException がスローされます。
問題はない。Autoboxing
Javaのように呼ばれるものがあります。
このリンクが役立ちます。
JLSによると -
Java プログラマーなら誰でも知っているように、int (またはその他のプリミティブ値) をコレクションに入れることはできません。コレクションはオブジェクト参照しか保持できないため、プリミティブ値を適切なラッパー クラス (int の場合は Integer) にボックス化する必要があります。コレクションからオブジェクトを取り出すと、入れた整数が得られます。int が必要な場合は、intValue メソッドを使用して Integer をアンボックスする必要があります。このボックス化とボックス化解除はすべて面倒であり、コードが乱雑になります。自動ボックス化およびボックス化解除機能により、プロセスが自動化され、手間と煩雑さが解消されます。
知っておくべき潜在的な問題はありますか?
いいえ、問題ありません。Java バージョン 1.5+ のコンパイラは、この場合、自動ボクシングlong
を実行してリテラルをLong
オブジェクトに変換します。
ただし、参照をボックス化解除するLong
と.long
null
NPE
例えば:
list.add(null);
long val = list.get(0); // NPE will be thrown here.
(最新バージョンの) Java は、このような状況でオブジェクトとプリミティブ型の間で自動的に変換できるため、これに問題はありません。いわゆるオートボクシングです。