Java类问题

Java类问题,java,class,Java,Class,public Object foo(){return this;}引发编译错误。为什么呢?有人能解释为什么“对象”类型是不可能的吗?对象是第一类、第二类的基类吗?如果是,为什么会抛出错误 请更改问题的标题,因为我找不到合适的标题。您正在以不受支持的方式更改foo方法的签名。多态性仅适用于不同的参数列表,而不适用于仅因返回类型不同而不同的相同方法 如果你仔细想想,这是很自然的。。。如果它能工作,并且只知道两个超类中的一个的人会调用Three.foo(),他会希望它返回一个1(因为这就是它在1和2中

public Object foo(){return this;}
引发编译错误。为什么呢?有人能解释为什么“对象”类型是不可能的吗?对象是第一类、第二类的基类吗?如果是,为什么会抛出错误


请更改问题的标题,因为我找不到合适的标题。

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

如果你仔细想想,这是很自然的。。。如果它能工作,并且只知道两个超类中的一个的人会调用Three.foo(),他会希望它返回一个1(因为这就是它在1和2中的工作方式),但在三个超类中,您实际上可以返回一个HashMap,并且仍然可以正常工作

Jon(在下面的注释中)是正确的,您可以缩小范围,但是您仍然会遵循返回“一”(如果您从Three.foo()返回三)的协议,因为子类都将实现超类接口。
但是,返回类型仍然不是多态性的一部分,因此您不能有三种只因返回类型不同而不同的方法。

three.foo
正在尝试重写
three.foo()
,但它没有正确地执行此操作。假设我要写:

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; }
}
忽略实际上
Three.foo()
确实返回一个
One
,那么
Three.foo()
的签名并不能保证它。因此,对于必须返回
One
的方法,它不是一个合适的重写

请注意,您可以更改返回类型并仍然重写,但它必须更具体,而不是更少。换句话说,这没关系:

One f = new Three();
One other = f.foo();
因为
Three
One

更具体,它将启用:

class Three extends Two {
    public Three foo() { return this; }
}

重写一个方法并试图返回一个不太特定的类型是违反了,这表示子类必须满足其超类的所有契约。类3违反了超类约定“foo()返回一个实例”。

不正确。您可以通过使返回类型更具体来重写。我正要在编辑中这样说,但您对我来说太快了:-)
class Four extends Three {
public Object foo() { return "This String is not an instance of One"; }
}