2013-10-14 201 views
-4

我有一個接口和抽象類編譯錯誤:與接口和抽象類

interface MyInterface {int presents();}; 

public abstract class MyAbstractClass implements MyInterface { 
    abstract void presents(); 
    abstract void chill(); 
} 

編譯器會抱怨,在

abstract void presents(); 

返回類型是不符合

MyInterface.presents() 

提供以下選項:

make it int type 
make MyInterface.presents void type 

這是怎麼發生的?

+7

編譯器錯誤沒有說足夠嗎? –

+2

abstract void presents();有一個返回類型的無效,而接口的present()有一個int返回類型...老兄嚴重嗎? – Thihara

+3

現在,他正在低估所有正確的答案。 – chrylis

回答

8

你定義的方法presents()Gift接口返回int。 然後,您嘗試重新定義方法presents(),返回類型void名爲myClass

很明顯int不是void。這意味着返回類型不兼容。

你對方法的繼承感到困惑。問題是Java的語法(以及所有類似C語言),不規定返回值的使用,因此,即使你方法返回int你仍然可以調用它像以下:

presents();

因此,假設該編譯器允許您使用名爲presents()的兩種不同方法:一種返回int,其他返回void。編譯器如何理解在我們的例子中使用哪種方法?答案是沒有辦法。這就是你可以使用不同參數簽名覆蓋方法的原因,例如

presents(); 
presents(String str); 
presents(int n); 

然而,你不能有2個方法具有相同的參數簽名和不同的返回類型。

4

在接口中,presents被定義爲返回int,但在您的類聲稱實現該接口,它是void。這兩個需要匹配。

3

因爲接口的方法是presents()而且您正試圖在此處更改方法簽名。

如果你不想要那個方法寫一個新的。

abstract void anotherPresents(); 

滿足原始簽名

abstract int presents();