人間だったら考えて

考えて考えて人間だったら考えて

複数のインターフェースを実装したクラスに対するオーバーロード問題

2つのインターフェース(interfaceA, interfaceB)を実装したクラス TestAandB を考えます。

interface interfaceA {}

interface interfaceB {}

class TestAandB implements interfaceA, interfaceB {}

interfaceA型のオブジェクトを引数に取る関数 test(interfaceA iA) を定義します。

public static void test(interfaceA iA) {
	System.out.println("interfaceA");
}

以下のようにmain関数を実行すると、"interfaceA"と出力されます。

public class Main {

	public static void main(String[] args) {
		TestAandB obj = new TestAandB();
		test(obj);
	}
	
	public static void test(interfaceA iA) {
		System.out.println("interfaceA");
	}
	
}

次に、interfaceB型のオブジェクトを引数に取る関数 test(interfaceB iB) を追加で定義します。(オーバーロード

public class Main {

	public static void main(String[] args) {
		TestAandB obj = new TestAandB();
		test(obj);
	}
	
	public static void test(interfaceA iA) {
		System.out.println("interfaceA");
	}

	public static void test(interfaceB iB) {
		System.out.println("interfaceB");
	}
	
}

このとき、test関数はどちらが実行されるのでしょうか?


実は、このコードはコンパイルできません。

Exception in thread "main" java.lang.Error: Unresolved compilation problem: 
	The method test(interfaceA) is ambiguous for the type Main

どちらのtest関数を呼べばいいのか分からないので、"ambiguous"だと言ってくれます。

今回は単純な例でしたが、親クラスの方でインターフェースを実装していることに意識を向けていなかったりすると、このようなコードを書いてしまう(?)かもしれないですね。。。