考虑下面的示例。

为什么为什么不允许我将BImpl用作doSomething3方法的参数类型?当我说“不允许”时,是指Eclipse抱怨接口AInf中的doSomething3-方法未实现。

interface AInf
{
    AInf doSomething();
    BInf doSomething2();
    void doSomething3(BInf param);
}


interface BInf
{

}

class AImpl implements AInf
{

    @Override
    public AImpl doSomething() {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public BImpl doSomething2() {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public void doSomething3(BImpl param) // This method is not overriding the doSomething3(BInf param) from the AInf
    {
        // TODO Auto-generated method stub
    }
}

class BImpl implements BInf
{

}

最佳答案

因为doSomething3(BImpl param)没有实现doSomething3(BInf param)

BInf可以有许多实现,并且该方法应该对所有实现有效,而不仅仅是一种。

请始终记住,扩展类或实现接口定义了is a关系。所有扩大/缩小规则都是逻辑上的结果。

如果您通过一个特定的示例来想象它,那就更容易了:金钱。硬币是金钱,纸币也是金钱。

如果您去一家商店,决定限制他们给您的零钱,从购买到硬币,这可能很烦人,但这是合法的。没关系,因为这不会破坏合同,他们总是在退钱。

但是,当您在一家商店时,他们应该接受货币,而他们不会接受您的硬币,那就不好了。

10-08 13:21