我有一个具有以下结构的程序
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级'并相应地施放?这也错了
答案 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;
}
*/