Почему возвращаемый тип метода с тем же именем должен быть одинаковым в подклассе Java?
Мой фон - C++. Я знаю, что такое перегрузка и что такое переопределение. Я хочу спросить, не хочу ли я переопределить метод от родителя и хочу создать свой собственный метод с другим типом возвращаемого значения и тем же именем, почему Java не позволяет мне это делать?
Пример:
class X{
public void k(){
}
}
public class Y extends X{
public int k(){
return 0;
}
}
Почему Java не применяет концепцию сокрытия здесь? средний класс Y должен скрывать метод X. в чем причина?
C++ применяя концепцию сокрытия.
#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 являются "виртуальными" (т.е. они демонстрируют полиморфизм подтипа). 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; }
};
И на Яве:
class Base {
Base f() { return null; }
}
class Derived extends Base {
@Override
Derived f() { return null; }
}