前段時間讀一些代碼,其中包含了若干複雜的implemens和extends關係,竟然在調用時出現了the method *** is ambiguous for the type *** . 一直覺得java中沒有多繼承,正常的多態怎麼會形成這種問題。請看下面的場景:java
public class AmbiguousExpector {
class A {
}
class B extends A implements IC{
}
interface IC {}
void test(A a){}
void test(IC b){}
void ambiguous(){
B b = new B();
test(b);
}繼承
}編譯
上述代碼沒法編譯,
The method test(AmbiguousExpector.A) is ambiguous for the type AmbiguousExpector AmbiguousExpector.java class
line 20 Java Problem。test
緣由:變量
B extends A的同時implements IC,可是在Class AmbiguousExpector 中的test方法簽名中,接受參數爲A 或者 IC,不幸的是變量b此時既知足test(A a),又知足Test(IC b),因此產生了ambiguous的錯誤。擴展
能夠嘗試註釋掉任意一個test方法,編譯均可以經過。或者增長test(B b).方法
上述錯誤當使用generic的時候能夠擴展以下:im
public class AmbiguousExpector {
class A {
}
class B extends A implements IC{
}
interface IC {}
<T extends A> void test(T a){}
<V extends IC>void test(V b){}
// void test(A a){}
// void test(IC b){}
void ambiguous(){
B a = new B();
test(a);
}註釋
}
結果同樣。