Posted at

IntとIntegerの引数でメソッドをオーバーロードする

・JDK1.5よりAutoBoxingが導入された.

例えばintとIntegerを自動変換してくれる.

メソッドの呼び出しにおいても同様である.

intの引数のメソッドをIntegerを使って呼び出すことができる.逆も可能である.

なかなか便利である.

・では課題.

・同じ名前のメソッドで引数をintとIntegerで定義したら、どのようになるか?

・コンパイルエラーにならないか?

・ならない場合に、どのように呼び分けられるか?

・得られた結論を書いておく

・同名のメソッドをそれぞれint、Integerの引数で定義できる

⇒ すなわちオーバーロードできる

・呼び出し側ではintまたはIntegerで呼び出すときちんと呼び分けられる

・どちらかのメソッドを削除しても、呼び出すことができて、残った方のメソッドが呼び出される


Tips0005.java

package jp.avaj.lib.algo;

import jp.avaj.lib.test.L;

public class Tips0005 {
public static void main(String[] args) {

// method0をintで呼出す
method0(1);

// method0をIntegerで呼び出す
method0(new Integer(10));

// method1をintで呼出す
method1(1);

// method1をIntegerで呼び出す
method1(new Integer(10));

// ここまでは、当たり前の結果..

// method2をintで呼出す
method2(1);

// method2をIntegerで呼び出す
method2(new Integer(10));

}
/** int引数のメソッド */
private static void method0(int v) {
L.p("intMethod0:"+v);
}
/** Integer引数のメソッド */
private static void method1(Integer v) {
L.p("integerMethod1:"+v);
}

/** int引数のメソッド */
private static void method2(int v) {
L.p("intMethod2:"+v);
}
/** Integer引数のメソッド */
private static void method2(Integer v) {
L.p("integerMethod2:"+v);
}


結果を見ればちゃんと呼び分けられている.

当たり前と言えば当たり前だが、当たり前であることの確認.

しかしむしろ、両方が定義できることが問題か?

もしかすると両方を定義していることに気がつかずバグることもなきにしもあらず.


実行結果

intMethod0:1

intMethod0:10
integerMethod1:1
integerMethod1:10
intMethod2:1
integerMethod2:10