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したらこの問題解決すんじゃね(゚Д゚)?
  • もしそれが出来るならGenericsjava.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