一個java ambiguous method 的問題

前段時間讀一些代碼,其中包含了若干複雜的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);
    }註釋

}

結果同樣。

相關文章
相關標籤/搜索