我在解决方案中使用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")
您将收到一个可能恰好是MyElement
的Element
,但它可能是其他东西。 虽然这并非在所有情况下都是最好的方法,但有时低调是合适的
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();
// ...