2011-06-09 28 views
2

A類可以實現多個接口。Java - 兩個接口中的雙精度定義

我不明白的是在這種情況下會發生什麼:

public interface example1 { 
    void checkInt(int a); 
} 

public interface example2 { 
    void checkInt(int b); 
} 

public class class1 implements example1,example2 { 
    void checkInt(int c){ 
     System.out.print(c); 
    } 
    this.checkint(5); 
} 

我試圖運行它,它給了我編譯錯誤。但是我的問題總的來說,我可以實現兩個接口,它們具有相同簽名的功能嗎?

+1

「我可以繼承fron兩個接口嗎」 - 你不從接口繼承,你實現它們......你得到了什麼編譯錯誤? – forsvarir 2011-06-09 13:30:47

+0

是的,實現。錯誤並不重要。該選址可能嗎?因爲它沒有意義 - 如果我有2個接口具有相同的名稱和簽名,但具有不同的含義? – Tom 2011-06-09 13:32:51

+0

我會覺得有兩個方法具有相同的名稱但具有不相容的含義會令人困惑。 – 2011-06-09 13:40:23

回答

3

您收到了哪些彙編錯誤?因爲this.checkint出錯了,應該是checkInt(5)?此外,您正在將隱式公共方法(如所有接口方法)的方法範圍縮減爲默認(打包保護)。 checkInt方法需要在實現類中公開。

兩個接口定義的方法,但由於沒有對class1一個實現,這是好的。因此,class1以其實現checkInt(int i)實現了每個接口的實現方法。隨着你只是履行合同的接口,所以不存在歧義哪些方法來調用 - 如果你用它仍然會在class1相同checkInt方法,該方法被調用example1型或example2的參考工作。

2

的編譯錯誤是因爲你缺少的方法checkInt實現類visibility屬性(公共),你有一個不是由任何方法封閉的聲明。

但總的來說,如果你有實現具有共同的方法簽名多個接口的類,那麼類將只有一個實現,以滿足這兩個接口。

1

我敢肯定你的編譯錯誤是從this.checkint(5)線,而不是接口實現。實現兩個共享具有相同簽名的方法的接口是完全合法的,並且您已經完成了上述操作。

你可以這樣想:當一個類實現一個接口時,它同意實現接口定義的所有方法。只要你已經滿足了每個接口的這個要求,那麼你實際編寫的方法有多少並不重要。

另外,還要考慮接口到底是如何使用:

example1 e1 = new class1(); 
e1.checkInt(3); // Calls class1.checkInt() 

example2 e2 = new class1(); 
e2.checkInt(3); // Also calls class.checkInt() 

接口變量實際上指的是類型Class 1的對象,所以它的Class1的方法是重要的,而不是其他接口CLASS1工具。

0

您不會繼承一個接口,您可以實現它。實現接口對你來說是什麼是通知你的課程的消費者,你保證你將有一套可用的方法。許多接口在合同中可以有一個方法簽名,但由於只有實現類具有實際代碼,所以沒有問題。

0

是的,你可以實現這兩個接口。但是,通常不推薦這樣做,因爲它可能會導致您說的混亂。

您只能在特定情況下實現兩個接口,即參數,名稱和返回類型完全匹配,否則會有衝突。如果名稱或參數類型不同,則需要分別實現兩者。如果所有不同的是返回類型,那麼當它們發生衝突時不可能實現這兩個接口。

如果兩個接口碰巧對方法有不同的含義,那麼最好提供一個適配器。請參閱Adapter pattern

A whole article on solving this problem has been written here

你的編譯錯誤是由於其他原因(在這種情況下,你還沒有宣佈你的實現方法public),並看着你提供的代碼示例,可能還有很多其他的東西!

+1

'只能在非常特殊的情況下實現這兩個接口,即參數,名稱和返回類型完全匹配,否則會出現衝突'不完全正確。在這種情況下,你需要實現它們中的每一個。 – 2011-06-09 13:39:33

+0

謝謝,我已澄清 – 2011-06-09 13:42:16

0

類從接口不inherit

Classes inherit Classes 
Interfaces inherit interfaces 
Classes `implements` Interfaces 

你舉的例子是完全沒有問題的接口只是聲明的簽名(或合同),沒有定義的行爲。類實現提供行爲的接口。所以一個實現兩個接口的類可以爲這兩種方法提供「相同」的實現 - 合同不會像is這樣的類提供這種行爲。