返回超类对象的超类方法



我在解决方案中使用JDOM库。
我创建了以下类,因为我希望添加功能(主要是get方法,以解析 XML 元素中的特定类型的数据)。

public class MyElement extends Element {
    // methods such as...
    public Boolean getBoolean(){
    }
}

当然,带有数据的元素不是根元素,所以我想要做的是:

// MyElement variable "data" has been assigned before
Boolean isTest = data.getChild("isTest").getBoolean();

问题是getChild返回一个Element对象(由超类实现),而超类又不知道子类方法。

从我在其他问题中读到的内容来看,向下投射行不通吗?
我已经想到了覆盖getChild方法,但也需要一个沮丧的方法,对吧?

是否可以使用或重写超类方法,以便可以将返回的Element对象视为MyElement对象?

我发现了这个问题,但这假设你也可以改变超类的方法。

我可能会创建一个静态类来保存 Element 的"扩展方法"。这类似于 Integer.parseInt(String s);

Boolean isTest = MyElement.getBoolean(data.getChild("isTest"));

实现将是

public static class MyElement {
    public static boolean getBoolean(Element e) {
        // Do your thing.
        return e.getValue() == "true" || e.getValue() == "1";
    }
}

你可以检查 Element 的实例,看看它是否是 MyElement,然后强制转换它。但是,只有当元素确实属于该实例时,此强制转换才会成功。这意味着您添加了构造它并将其添加到您的文档中。

希望这有帮助。

如果可以将@Overrides注释添加到方法中,并且编译器不抱怨,则即使定义了 Element.getBoolean(),也会调用您的方法。

public class MyElement extends Element {
   @Override
   public Boolean getBoolean() {
      ... whatever there was before, My element will return this ...
      return true;
   }
}

如果无法添加@Override,则Element没有getBoolean()方法,因此当您添加

data.getChild("isTest")

您将收到一个可能恰好是MyElementElement,但它可能是其他东西。 虽然这并非在所有情况下都是最好的方法,但有时低是合适的

Element element = data.getChild("isTest");
Boolean boolValue;
if (element instanceof MyElement) {
   boolValue= ((MyElement)element).getBoolean();
} else {
   boolValue= Boolean.FALSE;
}

我故意回答时没有考虑实际的Element类型,因为理解规则比理解规则重要得多,因为它们仅适用于特定类。

祝你好运!

是的,您可以重写getChild方法,但不能更改返回类型(重写方法的签名无法更改),也就是说,您只能返回类型 Element 或其子类,这也是Element类型,因为它扩展了类Element。由于返回的子类被超类型接口隐藏,因此您需要将返回的Element类型向下转换为子类。

Boolean isTest = ((MyElement) data.getChild("isTest")).getBoolean();

您可以编写简单的方法,该方法会自动将Element向下转换为子类以缩短代码。

public static MyElement myElement(Element e) {
    return (MyElement) e;
}
// ...
    Boolean isTest = myElement(data.getChild("isTest")).getBoolean();
// ...

最新更新