Java方法表示返回Class的对象但返回SubClass的对象

时间:2018-04-03 11:28:20

标签: java casting return-type

a method

public DimseRSP cfind(String asuid, String cuid, int priority,
        Attributes data, String tsuid, int autoCancel) throws IOException,
        InterruptedException {
    FutureDimseRSP rsp = new FutureDimseRSP(nextMessageID());
    rsp.setAutoCancel(autoCancel);
    cfind(asuid, cuid, priority, data, tsuid, rsp);
    return rsp;
}

我在我的应用程序中调用

DimseRSP rsp = association.cfind(...

然后我可以使用

rsp.someMethodOfTheDimseRSPClass()

哪个有效,但我想打电话

rsp.someMethodOfTheFutureDimseRSPClass()

相反,这应该是可能的,因为rspFutureDimseRSP实际从cfind()返回的实例,但当然我的IDE给了我一个错误,因为它认为{ {1}}只是rsp

我该怎么办?我可以以某种方式将DimseRSP投射到DimseRSP以便它可以工作吗?

3 个答案:

答案 0 :(得分:1)

如果您害怕rsp可能并非总是 FutureDimseRSP的实例,请使用instanceof

if (rsp instanceof FutureDimseRSP) {
    ((FutureDimseRSP)rsp).someMethodOfTheFutureDimseRSPClass();
}
else {
    // handle this...
}

答案 1 :(得分:1)

另一个答案在技术上是正确的,你可以检查类型,如果可能的话,进行向下倾斜

但事情是:这样做通常是错误的方法。因为“签名说它返回超级阶级”的全部意义在于你需要进行向下转换。

换句话说:简单的解决方案是检查/强制转换。更好的解决方案是退回去了解全局,然后决定是否有办法避免进行检查/转换。例如,通过将该方法移动到超类中。或者通过定义定义该方法的接口,以便您的方法返回该接口。或者,或者 - 或许多选项。

答案 2 :(得分:0)

如果你不想演员,那么你总是可以添加抽象函数或正常函数&some 34; someMethodOfTheFutureDimseRSPClass"在DimseRSP类中并通过继承,函数" someMethodOfTheFutureDimseRSPClass"这将是FutureDimseRSP类的一部分将被调用。