Autoboxingとは、プリミティブ型からそれに対応するラッパークラス型の自動変換機能のことです。
Auto-Unboxingはその逆で、ラッパークラス型からそれに対応するプリミティブ型の自動変換機能のことです。
イコール(代入演算子)の記号の左右は基本的に同じ型にしますが、プリミティブ型とラッパークラス型の間には相互的に自動変換が行われるため、左右にデータ型が異なるものを記述できます。
具体的には、以下のようなコードになります。
1 2 |
Integer num = 10; // Autoboxing int val = num; // Auto-Unboxing |
この機能は変数の代入時に自動変換されるだけではありません。最もこの機能の便利さを享受できるのは、メソッドの呼び出し時に、引数を渡すときや戻り値を受け取るときです。
引数の受け渡すときや戻り値の受け取る時にもデータの代入は行われています。上記の場合、引数では『Integer i = num ;』のような代入が行われ、戻り値では『int ans = i * 2 ;』のような代入が内部的に行われています。Autoboxing(Auto-Unboxing)の機能がなかったときは、引数であれば変換をしてから渡す必要があり、戻り値では受け取った後に変換する必要がありました。
Autoboxing(Auto-Unboxing)は、既に用意されているクラスのメソッドでは下記のような場合に活躍します。
自作メソッドであれば、都合のいいようにプリミティブ型とラッパークラス型のどちらかに合わせてしまうこともできますが、提供されているメソッドではそういうわけには行きません。
JavaのAPIには、参照型を引数にもつメソッドが多く存在します。
例えば、ArrayListクラスのadd()メソッドの引数に指定できるのは参照型だけで、プリミティブ型は指定できません。
しかし、自動変換のおかげで、プリミティブ型が許可されているかのように記述できるのです。
1 2 3 |
ArrayList<Integer> list = new ArrayList<>(); list.add(new Integer(10)); //Autoboxingを利用していない記述 list.add(20); //AutoBoxingを利用した記述 |
いくつかAutoboxing(Auto-Unboxing)が活用されている例を紹介しました。
この機能はとても便利で、欠かせないものだとご理解いただけたと思います。