class One {
public One foo() { return this; }
}
class Two extends One {
public One foo() { return this; }
}
class Three extends Two {
public Object foo() { return this; }
}
Run Code Online (Sandbox Code Playgroud)
public Object foo() { return this; }抛出编译错误.这是为什么?有人可以解释为什么"对象"类型不可能吗?对象是Class One,Two的基类吗?如果那么为什么会抛出错误?
请更改问题的标题,因为我找不到合适的标题.
Jon*_*eet 16
Three.foo试图覆盖Two.foo(),但它没有正确地做到这一点.假设我要写:
One f = new Three();
One other = f.foo();
Run Code Online (Sandbox Code Playgroud)
忽略实际上 Three.foo() 确实返回a 的事实,One签名Three.foo()并不能保证它.因此它并不适合其的方法适当控就不得不返回One.
请注意,您可以更改返回类型并仍然覆盖,但必须更具体而不是更少.换句话说,这没关系:
class Three extends Two {
public Three foo() { return this; }
}
Run Code Online (Sandbox Code Playgroud)
因为Three比具体更具体One.
您正在以不支持的方式更改foo方法的签名.多态性仅适用于不同的参数列表,不适用于仅由返回类型不同的相同方法.
如果你考虑一下,这很自然......如果它有效并且只知道两个超类之一的人会调用Three.foo()他会期望它返回一个(因为它就是这样的在One和Two中工作)但在Three中你实际上可以返回一个HashMap并且仍能正常运行.
Jon(在下面的评论中)是正确的,你可以缩小范围但是你仍然会遵循你将返回"One"的协议(你应该从Three.foo()返回一个三)因为子类都将实现超类接口.但是,返回类型仍然不是多态的一部分,因此您不能有三种不同的方法,只有返回类型不同.
| 归档时间: |
|
| 查看次数: |
480 次 |
| 最近记录: |