2014-01-15 75 views
1

我在Java中有以下情形。比方說,我有一個接口和兩個實現此接口的類。如下:調用方法沒有在Java中實現的接口的接口中定義

公共接口MyInterface的{

public String printStuff(); 

}

公共類A實現MyInterface的{

@Override 
    public String printStuff(){ 
     return "Stuff"; 
    } 

}

公共類B實現MyInterface的{

@Override 
    public String printStuff(){ 
     return "Stuff"; 
    } 

    public String printOtherStuff(){ 
     return "Other Stuff"; 
    } 

}

如何調用printOtherStuff方法上面,如果我這樣定義它:

public void Main(){ 

     myInterface myinterface = new B(); 
     String str = myinterface.printOtherStuff(); // ? This does not work 
} 

上述調用代碼似乎並不工作。有任何想法嗎?

回答

14
myInterface myinterface = new B(); 

參考類型myinterfacemyInterface。這意味着您只能訪問界面中定義的方法。您可以將其轉換爲鍵入B以進行方法調用。

備註:從這裏開始,我將使用正確的命名約定。

MyInterface myInterface = new B(); 

String str = ((B)myInterface).printOtherStuff(); 

這個

如果你需要做到這一點,那麼你需要看看你的類設計剛一說明。以這種方式使用interface的想法是從對象的具體實現的細節中抽象出來。如果你不得不像這樣執行一個明確的演員表演,那麼你可能想要考慮改變你的界面以適應必要的方法,或者改變你的課程,以便將該方法移動到全球位置(如util文件或東西)。

額外的閱讀

你應該閱讀有關引用類型here,你應該看看鑄造here。我的答案是對這兩件事的理解的結合。

作爲補充說明,請看Java Naming Conventions。這是任何Java開發人員製作可理解代碼的重要信息。

+1

+1。寫得很好,詳細的答案。 – Maroun

+0

謝謝!非常翔實的答案。特別感謝關於命名約定的提示。 :) – rameezk

1

當然,這不會工作,因爲你有參考類型Interface MyInterface。在方法綁定編譯器會嘗試在您的Interface MyInterface中找不到此方法。所以你需要把它像這樣扔給你的班級。

MyInterface myInterface = new B(); 
    B newB=(B) myInterface ;//casting to class 
    newB.printOtherStuff();// would work fine