1

对不起,我之前有错误的代码...

所以我有一个看起来像这样的界面:

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

我有一个看起来像这样的接口的实现:

public class Human implements Player
{
    private Human partner;

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

所以编译器说我没有实现 Player 的每个方法,这向我表明我必须完全匹配 setPartner 方法的参数类型,即使人类是一个玩家。有什么好的方法可以解决这个问题或以不同的方式实施吗?

4

3 回答 3

3

在Java中,方法参数是不变的。这意味着void setPartner(Player partner)方法签名与方法签名不同,void setPartner(Human partner)即使Humanis-a 也是如此Player。所以你不能这样实现(或覆盖)。

扩展一个类时必须小心,因为如果Player是一个类并且该方法不是抽象的,而不是它实际上可以工作,但是您会重载该方法而不是覆盖它。

于 2012-10-04T23:30:44.540 回答
2

你不能有协变参数(如果你通过 Player 接口操作你的 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;
    }
}

但是,您不能强制实现类实际使用自己的类型作为 Player 的类型参数。

于 2012-10-04T23:26:38.783 回答
1

这是有道理的,因为setPartner(Human)它比setPartner(Player). 通过实施Player,您是说setParner接受任何Player. 您的setPartner(Human)方法只接受子类Human而不接受其他Player实现。

于 2012-10-04T23:51:11.073 回答