プリミティブ対オブジェクト / オートボクシング
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2020/11/24 15:35 UTC 版)
「Javaに対する批判」の記事における「プリミティブ対オブジェクト / オートボクシング」の解説
Javaの設計者らは、現在他の言語にあるいくつかの機能(多重継承、演算子多重定義、タプルなど)を実装しないことを決めた。 総称型(ジェネリクス)がJava 5.0に導入されたとき、すでにJavaにはクラスの大規模な枠組みがあった(それらの多くはすでに非推奨となっていた)、そして後方互換性を保つため、総称型の実装方法として既存のクラスを維持することを可能にする(コンパイル時の)型消去(型削除、type erasure)が選ばれた。これは、他の言語と比べると、総称型の導入によって提供される機能を限定してしまう結果になった。 Javaのプリミティブ型はオブジェクトではない。プリミティブ型は値への参照ではなく値そのものをスタック領域に保持している。この設計選択はパフォーマンス上の理由により行われた。このためJavaは純粋なオブジェクト指向言語と見なされていない。またこのことによりリフレクションがより複雑になっている。配列を除き、Javaのコレクションクラスはプリミティブ型を直接扱うことができず、プリミティブラッパークラスへのボックス化が必要となる。この制約はジェネリクスにおいても変わりない。Javaのジェネリクスは型安全性が担保されるだけであり、ジェネリクスを使わない場合と比べてパフォーマンス上のメリットはない。 また、Java 5.0は、コンパイル中に要求された場合にプリミティブ型を対応するプリミティブラッパークラスのオブジェクトに自動変換する機能(オートボクシング)をサポートしているが、オートボクシングではNullPointerExceptionが投げられる可能性がある。オートボクシングは暗黙のうちに起こる(キャストやメソッド呼び出しを伴わない)ため、このNullPointerExceptionという非チェック例外はJavaプログラムのコードに目を通しただけでは明確にはならない恐れがある。
※この「プリミティブ対オブジェクト / オートボクシング」の解説は、「Javaに対する批判」の解説の一部です。
「プリミティブ対オブジェクト / オートボクシング」を含む「Javaに対する批判」の記事については、「Javaに対する批判」の概要を参照ください。
- プリミティブ対オブジェクト / オートボクシングのページへのリンク