2011-10-13 91 views
20

可能無法完成以下操作(我收到一個編譯錯誤:「繼承方法A.doSomthing(int)無法隱藏B中的公共抽象方法」 ):Java:擴展一個類並實現具有相同方法的接口

public class A { 
    int doSomthing(int x) { 
     return x; 
    } 
} 

public interface B { 
    int doSomthing(int x); 
} 

public class C extends A implements B { 

    //trying to override doSomthing... 

    int doSomthing(int x) { 
     return doSomthingElse(x); 
    } 
} 

假設允許我改變A和B都不,我的問題是,我可以以某種方式以這樣一種方式,它會從A和B都繼承定義C(假設它需要一些框架C將是A和B的一個實例)。

如果不是,你將如何解決這個問題?

謝謝!

+0

請報告你的錯誤。這裏沒有什麼明顯的錯誤,除了可能缺少@Overrides,如果你使用1.6。 – bmargulies

+2

@bmargulies,沒有'公共'和重寫只是一個可選的煩惱。 – bestsss

回答

24

使該方法公開

public class C extends A implements B { 

    //trying to override doSomthing... 

    public int myMethod(int x) { 
     return doSomthingElse(x); 
    } 
} 

接口方法總是public

或者只是使用組成,而不是繼承

+0

謝謝你和所有其他響應者。它解決了問題! – rapt

+0

變量既可以是類實例又可以繼承接口嗎?在你的例子中,它會像'new C()implements X',假設X是接口 – Vadorequest

+1

@Vadorequest實現或擴展在類級而不是實例級完成。爲了實現X,你需要把它添加到接口列表中:'public class C extends A implements B,X {...}' –

2

這與知名度做。您在C中爲myMethod使用default(無修飾符)可見性,但根據接口B需要爲public

現在,你可能會認爲你使用,因爲既不ABdefault能見度個個,也不C你明確選擇的public一個,private,或者protected。但是,界面使用public,無論您是否明確指出。

+0

謝謝!我確實知道它,但你確實提醒了我。 – rapt

0

只要在C中覆蓋它時簡單使用方法public即可。

7

方法doSomethis()包私人在A類:

public class A { 
    int doSomthing(int x) { // this is package-private 
     return x; 
    } 
} 

但它是在接口乙公共

public interface B { 
    int doSomthing(int x); // this here is public by default 
} 

編譯器正在被C繼承了doSomething()來自A,這是封裝私有的作爲B中的一個實現,它是public。這就是爲什麼它的抱怨 -

"The inherited method A.doSomthing(int) cannot hide the public abstract method in B"

因爲,雖然壓倒一切你不能縮小方法的訪問級別的方法。

解決方案是容易的,在C類 -

@Override 
public int doSomthing(int x) { 
    // ... 
} 
相關問題