Java方法声明返回DimseRSP实际返回FutureDimseRSP,如何调用子类方法?
解决方法:调用FutureDimseRSP的专属方法
嘿,这个场景很典型——方法返回的是父类类型,但实际实例是子类,想要调用子类的专属方法,咱们有两种靠谱的方案:
方案一:强制类型转换(无需修改原有方法)
因为你调用cfind后得到的DimseRSP实例本质上就是FutureDimseRSP(方法内部明确new了这个子类对象),所以可以通过强制类型转换来获取子类引用,进而调用专属方法。为了代码健壮性,建议先做类型检查:
DimseRSP rsp = association.cfind(...); // 先确认实例类型,避免潜在的ClassCastException if (rsp instanceof FutureDimseRSP) { FutureDimseRSP futureRsp = (FutureDimseRSP) rsp; // 这里就可以调用FutureDimseRSP的专属方法了 futureRsp.someExclusiveMethodOfFutureDimseRSP(); }
方案二:修改方法返回类型(更优雅的长期方案)
如果你有权限修改cfind方法的代码,直接把返回类型从DimseRSP改成FutureDimseRSP是最直接的方式,这样调用时不需要任何转换,代码更清晰:
修改后的方法:
public FutureDimseRSP 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; }
调用方式:
FutureDimseRSP rsp = association.cfind(...); // 直接调用专属方法即可 rsp.someExclusiveMethodOfFutureDimseRSP();
小提醒
如果选择方案一,一定要保留instanceof检查——虽然当前业务逻辑下返回的肯定是FutureDimseRSP,但如果后续方法实现有变更,这个检查能帮你避免运行时异常,让代码更健壮。
内容的提问来源于stack exchange,提问作者tom
相关产品推荐
相关产品推荐

