如何使用不同的返回类型实现overriden方法?

Tru*_*Tru 4 java oop abstract-class

考虑一下我在Java中有一个抽象类的情况;

public abstract class Foo
{
    public abstract int myOperation();
}
Run Code Online (Sandbox Code Playgroud)

现在,它的一些子类可能会覆盖myOperation,就像这样;

class A extends Foo
{
    public int myOperation()
    {
            // Do stuff
    }
}
Run Code Online (Sandbox Code Playgroud)

但是如果一个子类想要返回一些其他数据类型,比如;

class A extends Foo
{
    public Object myOperation()
    {
        // Do stuff
    }
}
Run Code Online (Sandbox Code Playgroud)

我希望方法名称相同,以保持设计完整,以便客户端不一定选择要调用的方法.除了使用一个是空实现或使用Object作为返回类型的单独方法之外,还有其他解决方法吗?或者这是OO设计的一个严重错误的例子?

我听说过C++中的Covariant返回类型,并想知道Java是否还有其他机制.

我也可以在这里自由使用界面.

Pab*_*ruz 8

你不能.既不使用继承,也不使用接口.这将是一个编译器错误,所以你根本无法运行你的程序.

您可以返回java.lang.Object并返回您想要的任何对象.如果需要返回基元,可以返回其对象包装器.


Mat*_*ams 7

"这是OO设计的一个非常糟糕的例子"是的.你不能这样做.


Pet*_*rey 5

Java具有共变量返回类型,但返回类型必须更具体,而不是更具体.如果父类中的方法返回,int那么它的所有子类型也必须这样做,否则这种方法的调用者并不真正知道它所获得的类型.

Foo foo = new A()
int i = foo.method();
Run Code Online (Sandbox Code Playgroud)

如果method()返回任何内容,但int此语句不再有意义.

当你可以做的是,如果超类中的方法返回Object并且一个dervice类返回,Number那么两者的子类都可以返回Integer