首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >奇怪的接口实现

奇怪的接口实现
EN

Stack Overflow用户
提问于 2012-10-05 07:09:13
回答 3查看 122关注 0票数 1

很抱歉我之前有错误的代码...

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

代码语言:javascript
运行
复制
public interface Player { 
    void setPartner(Player partner); 
}

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

代码语言:javascript
运行
复制
public class Human implements Player
{
    private Human partner;

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

所以编译器说我没有实现来自Player的每一个方法,这告诉我我必须精确匹配setPartner方法的参数类型,即使人类是一个Player。有什么好方法可以绕过这个问题,或者以不同的方式实现这个问题吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-10-05 07:26:39

你不能有协变参数(如果你通过播放器接口操作你的Human实例会发生什么?),但是你可以使用泛型。

代码语言:javascript
运行
复制
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
EN

Stack Overflow用户

发布于 2012-10-05 07:30:45

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

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

票数 3
EN

Stack Overflow用户

发布于 2012-10-05 07:51:11

这是有意义的,因为setPartner(Human)setPartner(Player)有更多的限制。通过实现Player,您就意味着setParner可以接受任何Player。您的setPartner(Human)方法只接受子类Human,而不接受其他Player实现。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12737305

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档