Почему возвращаемый тип метода с одинаковым именем должен быть таким же в подклассе Java?

Мой фон - С++. Я знаю, что такое перегрузка и что является основным. Я хочу спросить, не хочу ли я переопределить метод из родителя и хочу сделать свой собственный метод с другим типом возвращаемого имени и тем же именем, почему java не позволяет мне это делать?

Пример:

class X{
    public void k(){

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

Почему java не применяет здесь скрытую концепцию? средний класс Y должен скрывать метод X. в чем причина?

С++ с использованием концепции Hiding.

#include <iostream>
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;
}

Ответ 1

Потому что все методы в Java являются "виртуальными" (т.е. демонстрируют полиморфизм подтипов). С++ также запрещает конфликтующие типы возвращаемых данных при переопределении виртуальных функций-членов.

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() {}
^

Обратите внимание, что разрешены только конфликтующие типы возвращаемых данных. Доступны разные типы возврата, если они совместимы. Например, в С++:

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; }
}