我有Request类,它是一个父类,而AddressRequest类扩展了Request。
public AddressRequest extends Request
{
private String userId;
public String getUserId() {
return userId;
}
public void setUserId(String userId) {
this.userId = userId;
}
}
我在Request对象中有输入数据。如何通过调用子类中的setter方法将userId设置为同一个对象。
我将Request对象下载到AddressRequest对象并尝试调用正在抛出CTE的setter方法。
Request request= new AddressRequest ();
request=(AddressRequest )inputRequest;
request.setUserId("11");
如何在向下转换对象后调用子方法?
答案 0 :(得分:1)
所以,基本上你在这里做的是动态调度。通过指定
Request request= new AddressRequest ();
您正在做的是说此请求是一个AddressRequest,但通过将其称为请求,您无法访问AddressRequest的方法。
快速解决方案将是Safe Cast - >如果你确定你正在处理和AddressRequest,那么 将请求转换为
(AddressRequest) request.setUserId("11");
答案 1 :(得分:1)
您无法向下转发 超类引用类型 ,这是 超类 的实例。
您可以向下转发 超类引用类型 ,这是 子类 的实例。
您遇到案例#1,其中SETLOCAL ENABLEDELAYEDEXPANSION
FOR /F %%I IN ('C:\Windows\System32\schtasks.exe /QUERY /S <servername> /FO LIST /TN "\MICROSOFT\deploy_db" ^| FIND /C "Running"') DO (
IF %%I == 0 (SET STATUS=Running) Else (SET Status=Ready)
ECHO %%I
)
ECHO !STATUS!
的类型为inputRequest
,实例为Request
,即
Request
您无法将其强制转换为Request inputRequest = new Request();
,如果您尝试这样做,您将获得AddressRequest
因为ClassCastException
的对象既不是Request
的子类也不兼容它。
但如果您的AddressRequest
类型为inputRequest
且实例为Request
,那么您就可以成功。即
AddressRequest
你可以将它公平地转换为你的子类(Request inputRequest = new AddressRequest();
)并应用它的方法。
<强>要点:强>
AddressRequest
你不能将Request req1 = new Request();
Request req2 = new AddressRequest();
Request req3 = new SubClassOfAddressRequest();
强制转换为req1
:req1是Request的对象,它与AddressRequest不兼容。
您可以将AddressRequest
强制转换为req2
:req2是AddressRequest的对象,并且与AddressRequest兼容。
你仍然可以将AddressRequest
强制转换为req3
:req3是AddressRequest的SubClass的对象(这是一种向上转换)。
希望这有帮助!