【问题标题】:How can i call the child method after downcasting parent object to child object?将父对象向下转换为子对象后如何调用子方法?
【发布时间】:2016-06-21 12:52:51
【问题描述】:

我有作为父类的 Request 类和扩展 Request 的 AddressRequest 类。

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

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

【问题讨论】:

    标签: java inheritance polymorphism downcast


    【解决方案1】:

    所以,本质上您在这里所做的是动态调度。通过指定

    Request request= new AddressRequest ();
    

    你正在做的是说这个请求是一个地址请求,但是通过调用它一个请求你无法访问地址请求的方法。

    一个快速的解决方案是 Safe Cast -> 如果你确定你正在处理 AddressRequest,那么 将请求转换为

    (AddressRequest) request.setUserId("11");
    

    【讨论】:

    • 您可能需要编写 ( (AddressRequest) request).setUserID("11"); 以便编译器了解它需要转换对象然后运行该方法。
    • 还有更多关于类转换异常的信息:stackoverflow.com/questions/907360/…
    【解决方案2】:

    您不能向下转换 超类引用类型,它是一个超类的实例

    您可以向下转换 超类引用类型,它是一个子类的实例

    您遇到了案例#1,其中您的inputRequestRequest 类型和Request 的实例,即

    Request inputRequest = new Request();
    

    您不能将其转换为AddressRequest,如果您尝试这样做,您将得到ClassCastException 作为Request 的对象,既不是AddressRequest 的子类,也不兼容它。

    但如果你的inputRequestRequest 类型和AddressRequest 的实例,那么你就成功了。即

    Request inputRequest = new AddressRequest();
    

    您可以公平地将其转换为您的子类 (AddressRequest) 并应用它的方法。

    总结:

    Request req1 = new Request();
    Request req2 = new AddressRequest();
    Request req3 = new SubClassOfAddressRequest();
    

    您不能将req1 转换为AddressRequest:req1 是 Request 的对象,它与 AddressRequest 不兼容。

    您可以将req2 转换为AddressRequest :req2 是AddressRequest 的对象,并且与AddressRequest 兼容。

    您仍然可以将 req3 转换为 AddressRequest :req3 是 AddressRequest 的子类的对象(这是一种向上转换)。

    希望这会有所帮助!

    【讨论】:

    • 是的,谢谢。这很有帮助。我尝试使用 AddressRequest 的参数化构造函数并使用 Request 对象对其进行初始化。它现在可以工作了。
    • 您如何使用请求类型对象初始化 AddressRequest?你介意在这里分享构造函数吗?
    猜你喜欢
    • 1970-01-01
    • 2018-11-24
    • 2021-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多