为什么返回类型的同名方法应该在子类Java中相同?

我的背景是C ++。 我知道什么是重载,什么是压倒一切。 我想问一下,如果我不想从父级覆盖该方法,并希望使用不同的返回类型和相同名称创建自己的方法,为什么java不允许我这样做?

例:

class X{ public void k(){ } } public class Y extends X{ public int k(){ return 0; } } 

为什么java不在这里应用隐藏概念? 平均等级Y应该隐藏X的方法。 背后的原因是什么?

C ++应用隐藏概念。

 #include  class A{ public: void k(){ std::cout << "k from A"; } }; class B:public A{ public: int k(){ std::cout << "k from B"; return 0; } }; int main(){ B obj; obj.k(); return 0; } 

因为Java中的所有方法都是“虚拟的”(即它们表现出子类型多态性)。 在覆盖虚拟成员函数时,C ++也不允许冲突的返回类型。

 struct Base { virtual void f() {} }; struct Derived : Base { int f() override { return 0; } }; 

编译器输出:

 8 : error: conflicting return type specified for 'virtual int Derived::f()' int f() { return 0; } ^ 3 : error: overriding 'virtual void Base::f()' virtual void f() {} ^ 

请注意,仅允许冲突的返回类型。 允许不同的返回类型,只要它们兼容即可 。 例如,在C ++中:

 struct Base { virtual Base* f() { return nullptr; } }; struct Derived : Base { Derived* f() override { return nullptr; } }; 

在Java中:

 class Base { Base f() { return null; } } class Derived extends Base { @Override Derived f() { return null; } }