考虑下面的示例。
为什么为什么不允许我将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
关系。所有扩大/缩小规则都是逻辑上的结果。
如果您通过一个特定的示例来想象它,那就更容易了:金钱。硬币是金钱,纸币也是金钱。
如果您去一家商店,决定限制他们给您的零钱,从购买到硬币,这可能很烦人,但这是合法的。没关系,因为这不会破坏合同,他们总是在退钱。
但是,当您在一家商店时,他们应该接受货币,而他们不会接受您的硬币,那就不好了。