2012-10-04 47 views
1

對不起,我有錯誤代碼之前...奇怪的接口實現

所以我有,看起來像一個接口:

public interface Player { 
    void setPartner(Player partner); 
} 

而且我有一個接口,它看起來像這樣的實現:

public class Human implements Player 
{ 
    private Human partner; 

    public void setPartner(Human partner) 
    { 
     this.partner = partner; 
    } 
} 

所以編譯器說,我不是從實現每一個玩家的方法指示給我,我要的setPartner方法的參數類型完全匹配,即使你呃一個人,是一個球員。有沒有什麼好的方法來解決這個問題,或者以不同的方式實施?

+0

我的代碼沒有出錯。 –

+3

您使用的是什麼版本的Java? IIRC,新版本將通過檢測「Human」確實是一個「Player」來支持您在此嘗試做的事情。但是,舊版本不具備此功能。 –

+3

方法協方差以Java 5開頭。 –

回答

2

您不能有協變參數(如果通過播放器界面操作您的Human實例會發生什麼?),但是您可以使用泛型。

public interface Player<T extends Player<T>> { 
    void setPartner(T partner); 
} 

public class Human implements Player<Human> { 
    private Human partner; 

    public void setPartner(Human partner) { 
     this.partner = partner; 
    } 
} 

但是,你不能強制執行類實際使用它自己的類型,播放器的類型參數。

+0

爲什麼通過'Player'操作''Human'會引起擔憂? – meriton

+0

感謝這正是我需要:) – user1721559

+0

@meriton在OP的代碼? human.setPartner(robot)其中,human是引用人類實例的Player變量,另一個引用Robot實例的機器人變量Player也是合法的,因爲Player.setPartner()帶有任何播放器。但是,Human.setPartner()只會使用另一個Human。 –

3

在Java中,方法參數是不變的。這意味着void setPartner(Player partner)方法簽名與void setPartner(Human partner)方法簽名不同,即使Human是-a Player。所以你不能像那樣實現(或覆蓋)。

如果Player是一個類,並且該方法不是抽象的,而是重載該方法而不是重寫它,則必須小心擴展類。

1

這很有道理,因爲setPartner(Human)setPartner(Player)更具限制性。通過實施Player,您的意思是setParner接受任何Player。您的setPartner(Human)方法僅接受子類Human而不接受其他Player實現。