奇怪的接口实现

时间:2012-10-04 23:09:13

标签: java interface

抱歉,我之前的代码错误了......

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

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方法的参数类型,即使a Human是Player。有没有什么好方法可以解决这个问题或以不同的方式实现这一点?

3 个答案:

答案 0 :(得分:3)

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

如果Player是一个类,并且该方法不是抽象而不是实际工作,那么在扩展类时必须小心,但是你会重载该方法而不是覆盖它。

答案 1 :(得分: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的类型参数。

答案 2 :(得分:1)

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