gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 18:06:37 25 4
gpt4 key购买 nike

我的背景是 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;
}

最佳答案

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

关于java - 为什么子类Java中同名方法的返回类型应该相同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35957019/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com