【问题标题】:Pass an instance of the subclass to a method and use it later within that method将子类的实例传递给方法并稍后在该方法中使用它
【发布时间】:2018-12-18 10:18:51
【问题描述】:

我有一个方法 (prepareErrorMessage),它接受 ErrorMessagePojoSuperclass 类型的对象。但是,我只将 ErrorMessagePojoSuperclass 的子类作为参数传递:

public class ErrorMessagePojoBundle extends ErrorMessagePojoSuperclass {}

public class Tester {
    ErrorMessagePojoBundle empb = new ErrorMessagePojoBundle();
    prepareErrorMessage(empb);

    public void prepareErrorMessage(ErrorMessagePojoSuperclass errorMessagePojo) {   
        String errorStatusMsg = messageConverter.convertXMLToString(errorMessagePojo);                             
    }
}

ErrorMessagePojoBundle 类比它的超类有更多的方法。

我需要确保当代码行运行messageConverter.convertXMLToString(errorMessagePojo) 时,messageConverter 处理子类的一个实例——在本例中为对象 empb。有任何想法吗?我想在不使用强制转换的情况下解决这个问题。谢谢。

【问题讨论】:

  • 欢迎来到 Stack Overflow。方法处理子类的一个实例,但它不能在没有强制转换的情况下调用任何新方法,因为编译器不知道这些方法存在。如果您可以提供minimal reproducible example,那么提供帮助会更容易 - 目前代码不完整,也无法编译。 (您有一个不在方法/构造函数中的非声明语句。)
  • ^^ 单独进行 MCVE 时,选择简单、易于区分的名称很有用,例如 SuperClassSubClass。长名称只是在最后有所区别。
  • 你好@Duke,Make static ErrorMessagePojoBundle empb = new ErrorMessagePojoBundle(); 否则编译器会抱怨。在此之后,调用的方法将属于ErrorMessagePojoBundle empb,而不是其超类。

标签: java inheritance subclass


【解决方案1】:

有什么想法吗?我想在不使用强制转换的情况下解决这个问题。

您的选择是:

  1. 使用必要的方法定义接口,让子类实现它,并将该接口用作参数类型而不是超类。
  2. 将参数类型更改为子类,而不是超类。
  3. instanceof 和强制转换(通常不是您想要做的)。

1 和 2 基本上只是彼此的变体。

在您的示例代码中,prepareErrorMessage 没有理由接受超类而不是子类(或接口),因为它所做的 only 事情只能通过子类来完成(或实现相同接口的东西)。

【讨论】:

    猜你喜欢
    • 2018-01-27
    • 2015-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多