抱歉,我之前的代码错误了......
所以我有一个看起来像的界面:
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。有没有什么好方法可以解决这个问题或以不同的方式实现这一点?
答案 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
实现。