オーバーロード時のボクシング/アンボクシングの挙動

パラメータとしてプリミティブ型を受け取るメソッドと、
ラッパークラスを受け取るメソッドをオーバーロードメソッドとして定義した場合、
プリミティブ型はプリミティブ型、ラッパークラスはラッパークラスの方を優先的に呼び出す。
で、プリミティブ型を渡すケースで、ラッパークラスを受け取るメソッドしか定義されていない場合はボクシングされる。
逆にラッパークラスを渡すケースで、プリミティブ型を受け取るメソッドしか定義されていない場合はアンボクシングされる。


ラッパークラスを渡すケース。

public class Main {
	public static void main(String[] args) {
		Sample s = new Sample();
		Integer data = 1;
		s.method(data);
	}
}
class Sample {
	public void method(int a) {
		System.out.println("A");
	}
	public void method(Integer a) {
		System.out.println("B");
	}
}
実行結果:B

プリミティブ型を渡すケース。

public class Main {
	public static void main(String[] args) {
		Sample s = new Sample();
		int data = 1;
		s.method(data);
	}
}
class Sample {
	public void method(int a) {
		System.out.println("A");
	}
	public void method(Integer a) {
		System.out.println("B");
	}
}
実行結果:A

ちなみに、プリミティブ型を渡す場合、暗黙的にキャストできるプリミティブ型がある場合、ラッパークラスよりそちらが優先される。

public class Main {
	public static void main(String[] args) {
		Sample s = new Sample();
		int data = 1;
		s.method(data);
	}
}
class Sample {
	public void method(long a) {
		System.out.println("A");
	}
	public void method(Integer a) {
		System.out.println("B");
	}
}
実行結果:A

コンパイルエラーになるパターンは、ラッパークラスを渡す場合で対応するラッパークラスを受け取るメソッドがなかった場合。
以下のようなパターン。

public class Main {
	public static void main(String[] args) {
		Sample s = new Sample();
		Integer data = 1;
		s.method(data);
	}
}
class Sample {
	public void method(Long a) {
		System.out.println("A");
	}
}

なぜなら、ラッパークラス間ではプリミティブ型と違い、暗黙的なキャストが行われないから。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です