在将父对象向下转换为子对象后,如何调用子方法?

时间:2016-06-21 12:52:52

标签: java inheritance polymorphism downcast

我有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");

如何在向下转换对象后调用子方法?

2 个答案:

答案 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的对象(这是一种向上转换)。

希望这有帮助!