我在解决方案中使用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
个对象?
我找到this question但是假设你也可以改变超类的方法。
答案 0 :(得分:0)
如果可以将@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")
您会收到一个可能恰好是Element
的{{1}},但它可能是其他内容。虽然它并非在所有情况下都是最佳方法,但有时适合向下转换
MyElement
我在没有考虑实际Element element = data.getChild("isTest");
Boolean boolValue;
if (element instanceof MyElement) {
boolValue= ((MyElement)element).getBoolean();
} else {
boolValue= Boolean.FALSE;
}
类型的情况下故意回答,因为了解规则比理解规则要重要得多,因为它们只适用于特定的类。
祝你好运!
答案 1 :(得分:0)
是的,您可以覆盖Container::value_type
方法,但不能更改返回类型(不能更改override方法的签名),也就是说,您只能返回类型while i < length(a):
if flag == 1 && a[i]=-1:
b[i]=a[i];
flag = -1;
else if flag == -1 && a[i] = 1:
b[i]=a[i];
flag = 1;
else:
b[i]=0;
i++;
}//end of while
或它的子类,也是getChild
类型,因为它扩展了Element
类。由于返回的子类被超类型接口隐藏,因此您需要将返回的Element
类型向下转换为子类。
Element
您可以编写简单的方法,将Element
自动转发到您的子类中以缩短代码。
Boolean isTest = ((MyElement) data.getChild("isTest")).getBoolean();
答案 2 :(得分:0)
我可能会创建一个静态类来保存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,然后将其强制转换。但是,如果Element实际上是该实例,则此强制转换只会成功。这意味着您添加了它并将其添加到您的文档中。
希望这有帮助。