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