ボクシングする方法あれこれ
動機
プリミティブ型の式(たとえば数値リテラル)はオブジェクトではないので、メソッドを呼び出すことはできません。
// コンパイルエラー 100.intValue();
そこで簡単な式でボクシング変換を起こす方法をいくつか紹介します。
たとえばメソッドチェイン中で使えます。
対策
以下コード
package test; public class BoxingTest { public static void main(final String[] args) { // コンパイルエラー (0) // 100.intValue(); // int -> Integer変換メソッド (1) Integer.valueOf(100).intValue(); new Integer(100).intValue(); // キャスト変換でのボクシング (2) ((Integer)100).intValue(); // 代入変換でのボクシング (3) Integer i; (i = 100).intValue(); // 条件式でのボクシング (4) (true ? 100 : null).intValue(); // メソッド起動変換でのボクシング (5) id(100).intValue(); } /** * 引数をそのまま返す。 * @param t * @return tをそのまま返す */ public static <T> T id(final T t) { return t; } }
- (1) ラッパークラスの変換メソッドを呼び出す
- valueOfかコンストラクタを使います。
- (2)キャスト変換でのボクシング
- ラッパークラスにキャストすると、ボクシングが起こります。
- (3)代入変換でのボクシング
- ラッパー型の変数に代入すると、代入式の型もラッパー型になります。
(1)〜(3)はラッパー型が必要なので、テンプレートにするのが面倒ですね。そこで(4)(5)がおすすめです。
- (4)条件式でのボクシング
- 第2、第3オペランドをプリミティブとnullにすると、式はラッパー型になります。
- (5)メソッド起動変換でのボクシング
- 引数にボクシング変換が起こるので、引数をそのまま返すメソッドは(ここではid)ボクシングに使えます。メソッドはジェネリックにできます。
まとめ
ボクシングは条件式かメソッド起動変換で起こす。
ところでラッパークラス、ろくなインスタンスメソッドがないですね。
使いそうなのはcompareToくらいか。
http://docs.oracle.com/javase/7/docs/api/java/lang/Integer.html