为什么相同命名方法的返回类型在子类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不允许隐藏虚拟函数?是的,我只是希望父对象的引用应该调用子对象的方法,为什么它在调用时考虑返回类型?你能解释一下吗?