Java Gold合格へ向けて
前回の記事の繰り返しになるが、改めてラッパークラスとオートボクシングの定義について確認しておきたい。
- ラッパークラス…基本型を参照型のように扱うことができる
- オートボクシング…基本型とラッパークラス型のそれぞれの自動変換機能
- Boxing…基本型からラッパークラス型への変換
- Unboxing…ラッパークラス型から基本型への変換
www.tokurotech.com 基本型と参照型については上記記事にまとめてある。基本型についてはJava Silverの範囲であるため、この辺りが怪しいという方はJava Silverの復習から始めるべきかもしれない。
要は参照型の変数を扱う上での注意点が、そのままラッパークラスには当てはまり、付随してオートボクシングの機能が問われるような内容となっている。よってJava Silverは完璧という方は、オートボクシングのみ覚えておけばいい。
オートボクシングという大層な名前をしているが、この機能が実現していることは「参照型であるラッパークラスを基本型のように扱える」ということだ。詳しく実装等を見ていこう。
ラッパークラス宣言してみた
それぞれラッパークラス型の変数の初期化に対し、参照型のようなアプローチと基本型のようなアプローチそれぞれが実装可能となっている。リテラル値をそのまま渡そうとするとデフォルトではint型 or double型になるため、short型やByte型に値を代入する場合はキャストが必要なところなどは基本型と変わりない。これは「基本型からラッパークラス型への変換」Boxingにより可能となっている。当然、記述法が違うからといって、Objects比較すれば等しい結果となる。
実行コード
public class Main { public static void main(String[] arg){ // Integer型 Integer intTest1 = new Integer(2147483647); Integer intTest2 = 2147483647; if (Objects.equals(intTest1, intTest2)) System.out.println("intTest1とintTest2は等しい"); // Short型 Short shortTest1 = new Short((short) 32768); Short shortTest2 = (short) 32768; if (Objects.equals(shortTest1, shortTest2)) System.out.println("shortTest1とshortTest2は等しい"); // Byte型 Byte byteTest1 = new Byte((byte) 128); Byte byteTest2 = (byte) 128; if (Objects.equals(byteTest1, byteTest2)) System.out.println("byteTest1とbyteTest2は等しい"); // Long型 Long longTest1 = new Long(9223372036854775807L); Long longTest2 = 9223372036854775807L; if (Objects.equals(longTest1, longTest2)) System.out.println("longTest1とlongTest2は等しい"); // Double型 Double doubleTest1 = new Double(1.1); Double doubleTest2 = 1.1; if (Objects.equals(doubleTest1, doubleTest2)) System.out.println("doubleTest1とdoubleTest2は等しい"); // Float型 Float floatTest1 = new Float(1.1); Float floatTest2 = (float) 1.1; if (Objects.equals(floatTest1, floatTest2)) System.out.println("floatTest1とfloatTest2は等しい"); // Character型 Character charTest1 = new Character('a'); Character charTest2 = 'a'; if (Objects.equals(charTest1, charTest2)) System.out.println("charTest1とcharTest2は等しい"); // Boolean型 Boolean boolTest1 = new Boolean(true); Boolean boolTest2 = true; if (Objects.equals(boolTest1, boolTest2)) System.out.println("boolTest1とboolTest2は等しい"); } }
実行結果
intTest1とintTest2は等しい
shortTest1とshortTest2は等しい
byteTest1とbyteTest2は等しい
longTest1とlongTest2は等しい
doubleTest1とdoubleTest2は等しい
floatTest1とfloatTest2は等しい
charTest1とcharTest2は等しい
boolTest1とboolTest2は等しい
参照型の変数は初期値を設定しないで利用しようとした場合、コンパイルが通らない。ラッパークラス型もそのルールは適用される。 実行コード
public class Main { public static void main(String[] arg){ // Integer型 Integer intTest1; System.out.println(intTest1); } }
実行結果
java: 変数intTest1は初期化されていない可能性があります
ラッパークラス使ってみた
それぞれのラッパークラスには、compareToメソッドと、intValueのような指定した型に変換した値を返すメソッドが用意されている。
- compareToメソッド…比較した結果、比較対象の方が大きかった場合は-1を、小さかった場合は1を、等しかった場合は0を返す
- 〇〇Valueメソッド…〇〇に入る型に変換して値を変換する。基本的に誤差は切り捨てられる
実行コード
public class Main { public static void main(String[] arg){ // Integer型 Integer intArrayTest[] = {1,2,3}; Integer intTest = 3; // Double型 Double doubleTest1 = 3.1; Double doubleTest2 = 3.9; System.out.println(intArrayTest[0].compareTo(intArrayTest[1])); System.out.println(intArrayTest[1].compareTo(intArrayTest[2])); System.out.println(intArrayTest[2].compareTo(intArrayTest[0])); System.out.println(intArrayTest[2].compareTo(intTest)); System.out.println(intTest.compareTo(doubleTest1.intValue())); System.out.println(intTest.compareTo(doubleTest2.intValue())); } }
実行コード
-1
-1
1
0
0
0
まとめ
基本型のように扱える参照型であるラッパークラスは、それぞれの良いところ取りをして使いやすいようになっている。オートボクシングに関しては値を代入する時にしか使われない機能なので、それ以外のことに関しては参照型のルールが適用されると考えれば覚えやすいのではないだろうか。