Java类问题

Sho*_*ban 4 java class

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.


Fre*_*rik 5

您正在以不支持的方式更改foo方法的签名.多态性仅适用于不同的参数列表,不适用于仅由返回类型不同的相同方法.

如果你考虑一下,这很自然......如果它有效并且只知道两个超类之一的人会调用Three.foo()他会期望它返回一个(因为它就是这样的在One和Two中工作)但在Three中你实际上可以返回一个HashMap并且仍能正常运行.

Jon(在下面的评论中)是正确的,你可以缩小范围但是你仍然会遵循你将返回"One"的协议(你应该从Three.foo()返回一个三)因为子类都将实现超类接口.但是,返回类型仍然不是多态的一部分,因此您不能有三种不同的方法,只有返回类型不同.