AutoBoxing
工業系のシステムや販売管理系のシステムに多いんですが
intやdoubleが混在するときってないですか?
いちいちintをdoubleにキャストしてまた元にもどして…。
…なんてやってると結構イライラきます。
で、AutoBoxingでなんとかならんのかと考えていました。
ちなみにAutoBoxingってのは1.5からの新機能です。
プリミティブ型を対応するクラス型に直接指定できてしまう。
つまり1.4までだったらこうだったけど…。
Integer integer = new Integer(1);
1.5からはこんなことが出来てしまう。
Integer integer = 1;
1.5からはなるべくプリミティブ型を使うより
クラス型を使いましょうって暗黙的言ってるのかな…?
で…1.5のJavaDocをぼんやり眺めていたらこんなもん発見。
java.lang クラス Number java.lang.Object ┗java.lang.Number すべての実装されたインタフェース: Serializable 直系の既知のサブクラス: AtomicInteger, AtomicLong, BigDecimal, BigInteger, Byte, Double, Float, Integer, Long, Short
- java.lang.Doubleとjava.lang.Integerってjava.lang.Numberの子クラスなんだ…(゚Д゚)ホゥ
- ひょっとしてNumberクラスに対してAutoBoxingしたらこの問題解決すんじゃね(゚Д゚)?
- もしそれが出来るならGenericsにjava.lang.Number指定したらオイシイことに(゚Д゚)?
やってみた。
import java.io.PrintStream; import java.util.*; public class AutoBoxingTest { private static final PrintStream o = System.out; public static void main(String[] args) { List<Number> NumberList = new ArrayList<Number>(); NumberList.add(2); NumberList.add(2.0); NumberList.add(2.12); NumberList.add(0.0); NumberList.add(0); NumberList.add(-0.0); NumberList.add(-2); NumberList.add(-2.0); NumberList.add(-2.12); for (Number n : NumberList) { o.println(n.toString()); o.println(n.getClass()); } } }
実行結果
2 class java.lang.Integer 2.0 class java.lang.Double 2.12 class java.lang.Double 0.0 class java.lang.Double 0 class java.lang.Integer -0.0 class java.lang.Double -2 class java.lang.Integer -2.0 class java.lang.Double -2.12 class java.lang.Double
これは便利!萌えた!
メソッドの引数にjava.lang.Number指定すれば
プリミティブの型は全部受けれることになる。
計算するときは〜Valueで値を抜いてくればおk。
Numberで四則演算もAutoBoxing出来たらもっと楽なんだけどなぁ…。
下位互換を考えると出来ないのかな?
ってかこれって常識の範囲だったんだろうか…!
追記。
逆コンパイルしてみた。
import java.io.PrintStream; import java.util.*; public class AutoBoxingTest { public AutoBoxingTest() { } public static void main(String args[]) { List NumberList = new ArrayList(); NumberList.add(Integer.valueOf(2)); NumberList.add(Double.valueOf(2D)); NumberList.add(Double.valueOf(2.1200000000000001D)); NumberList.add(Double.valueOf(0.0D)); NumberList.add(Integer.valueOf(0)); NumberList.add(Double.valueOf(-0D)); NumberList.add(Integer.valueOf(-2)); NumberList.add(Double.valueOf(-2D)); NumberList.add(Double.valueOf(-2.1200000000000001D)); Number n; for(Iterator iterator = NumberList.iterator(); iterator.hasNext(); o.println(n.getClass())) { n = (Number)iterator.next(); o.println(n.toString()); } } private static final PrintStream o; static { o = System.out; } }
なるほど。中で全部Newしてるわけか。
当たり前って言えば当たり前だけどw