方法返回值取决于实现类型

时间:2015-05-19 09:56:05

标签: java

我有一个具有以下结构的程序

  • abstract class A
  • class B extends A
  • class C extends A

所以class A有两种不同的实现方式。

现在我在abstract class A

中有一个通用方法
protected ReturnType doStuff() {
    //THe Return Type is the Problem
}

如果我在class B中使用此方法,我希望它返回class B的对象 在class C

中也是如此

问题:如何将ReturnType设置为B或C? 仿制药是正确的方法吗?我尝试过,但感觉不对,因为它们都是A的亚型。 或者我应该返回'A级'并相应地施放?这也错了

3 个答案:

答案 0 :(得分:3)

您可以执行以下操作

abstract class A<RT extends A> {
    protected abstract RT doStuff();
}

class B extends A<B> {
    // doStuff must return a B
}

class C extends A<C> {
    // doStuff must return a C
}

答案 1 :(得分:2)

Java支持方法的返回类型的协方差。

您可以将抽象方法声明为:

protected abstract A doStuff();

返回扩展A的内容时没有问题:

protected B doStuff() { ... }
protected C doStuff() { ... }

这非常安全,因为如果调用:

A a = new B();
A res = a.doStuff();

B扩展A,因此使用&#34;常规&#34;做所有事情都没有问题。 A同时具有共变型。

答案 2 :(得分:0)

你可以这样做。

A result = doSomeStuff();

这将返回A,但它将是被调用的类的实例。 A类将返回原始类。如果你在抽象类中调用另一个被超类覆盖的方法。将调用overriden方法,而不是抽象类中的方法。当然,如果你想要你也可以把它投射到实例类型。

如果您不想检查类型,可以使用反射......

protected A doSomeStuff()
{
    A a = null;
    try
    {
        a = this.getClass().getConstructor().newInstance();
    }
    catch (InstantiationException | IllegalAccessException | IllegalArgumentException
            | InvocationTargetException | NoSuchMethodException | SecurityException e)
    {
        e.printStackTrace();
    }

    return a;
}

/*
protected A doSomeStuff()
{
    if (this instanceof B)
    {
        return new B();
    }
    else if (this instanceof C)
    {
        return new C();
    }

    return null;
}
*/