为什么相同命名方法的返回类型在子类Java中应该相同? 我的背景是C++。我知道什么是重载,什么是重写。 我想问,如果我不想重写父级的方法,并且想用不同的返回类型和相同的名称创建自己的方法,为什么java不允许我这样做

为什么相同命名方法的返回类型在子类Java中应该相同? 我的背景是C++。我知道什么是重载,什么是重写。 我想问,如果我不想重写父级的方法,并且想用不同的返回类型和相同的名称创建自己的方法,为什么java不允许我这样做,java,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::co

例如:

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;
}
#包括
甲级{
公众:
void k(){

STD::CUT< P>,因为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中的所有方法都是“虚”的(即它们表现出子类型多态性)。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; }
}

你为什么要这样?例如,你松了TU创建虚拟函数的可能性。@ LasoLoz为什么java不允许改变返回类型。我知道如果我在C++中声明函数Virual,那么我需要返回类型(但是为什么?)java同样的问题为什么返回类型应该是相同的?我知道这是旧的,你可能已经有答案了。(虽然你还没有接受这个问题的任何答案),但我只是想澄清一下:假设你有一个类
Foo
和一个方法
List getValues()
。然后你有一个类
Bar
,它扩展了
Foo
,并“覆盖”了
getValues()
方法,但将返回类型更改为
Set
。现在,如果您编程到一个接口(通常是这样),您可能会有
Foo Foo=new Bar()
,但如果调用
List values=Foo.getValues()你有问题……所有的东西都说应该返回一个<代码>列表>代码>但是你最终得到了一个<代码>代码> oop.你为什么想要它?例如你松了TU创建虚拟函数的可能性。@ LasoLoz为什么java不允许改变返回类型。我知道如果我在C++中声明函数Virual,那么我需要返回相同的类型。(但是为什么?)Java的同一个问题为什么返回类型应该是相同的?我知道这是一个很老的问题,您可能已经有了答案(虽然您还没有接受这个问题的任何答案),但只是想澄清一下:假设您有一个类
Foo
,带有一个方法
List getValues()
。然后您有一个类
Bar
,它扩展了
Foo
并“覆盖”了
getValues()
方法,但将返回类型更改为
Set
。现在,如果您编程到一个接口(通常是这样),您可能有
Foo Foo=newbar()
,但是如果您调用
List values=Foo.getValues()
你有一个问题…所有的东西都说应该返回一个
列表
,但是你最终得到的是一个
集合
-oops。你能给我一些关于java的例子吗?未知隐藏通常被认为是不好的做法,因为它可能会让希望调用基类函数的类用户感到困惑。但是,我已经意识到我的答案是错误的。我已经用正确的理由更新了它。约瑟夫i已经知道了C++。但是java是什么?为什么java不允许?因为java中的所有方法都是虚拟的:你想知道为什么C++和java都不允许隐藏虚拟函数吗?是的,我只是期待父代的引用应该调用子对象的方法,为什么它在调用过程中考虑返回类型?你能解释一下吗?你能给我举个java的例子吗?它会在哪里引起问题?@未知隐藏通常被考虑到。C++的C++ java语言:一个很难的练习,因为它会让一个期望基类函数的用户感到困惑。但是,我意识到我的答案是错误的。我已经用正确的理由更新了它。约瑟夫i已经知道了C++。但是java是什么?为什么java不允许?因为Java中的所有方法都是虚拟的)你想知道为什么C++吗?Java不允许隐藏虚拟函数?是的,我只是希望父对象的引用应该调用子对象的方法,为什么它在调用时考虑返回类型?你能解释一下吗?