Java 返回超类对象的超类方法
我正在解决方案中使用JDOM库。Java 返回超类对象的超类方法,java,superclass,return-type,Java,Superclass,Return Type,我正在解决方案中使用JDOM库。 我创建了以下类,因为我想增加一些功能(主要是get方法来解析XML元素中特定类型的数据) 当然,包含数据的元素不是根元素,所以我要做的是: // MyElement variable "data" has been assigned before Boolean isTest = data.getChild("isTest").getBoolean(); 问题是getChild返回一个元素对象(由超类实现),而超类又不知道子类方法 从我在其他问题中读到的内容来
我创建了以下类,因为我想增加一些功能(主要是
get
方法来解析XML元素中特定类型的数据)
当然,包含数据的元素不是根元素,所以我要做的是:
// MyElement variable "data" has been assigned before
Boolean isTest = data.getChild("isTest").getBoolean();
问题是getChild
返回一个元素
对象(由超类实现),而超类又不知道子类方法
从我在其他问题中读到的内容来看,向下投射是行不通的?我曾想过重写
getChild
方法,但也需要一个downcast,对吗
是否可以使用或重写超类方法,以便返回的元素
对象可以被视为MyElement
对象
我发现了,但这是假设您也可以更改超类的方法。如果您可以将@Overrides注释添加到方法中,并且编译器没有抱怨,那么即使定义了元素.getBoolean(),也会调用您的方法
public class MyElement extends Element {
@Override
public Boolean getBoolean() {
... whatever there was before, My element will return this ...
return true;
}
}
如果无法添加@Override,则元素
没有getBoolean()
方法,这样做时
data.getChild("isTest")
您将收到一个元素
,该元素可能恰好是MyElement
,但它可能是其他元素。虽然在所有情况下,这不是最好的方法,但有时也应该悲观
我故意回答,没有考虑实际的元素
类型,因为理解规则比理解规则重要得多,因为它们只适用于特定的类
祝你好运 是的,您可以重写
getChild
方法,但是您不能更改返回类型(被重写方法的签名不能更改),也就是说,您只能返回类型Element
或者它的子类,它也是Element
类型,因为它扩展了Element
类。由于返回的子类被super-type接口隐藏,所以您需要将返回的元素类型向下转换为子类
Boolean isTest = ((MyElement) data.getChild("isTest")).getBoolean();
您可以编写简单的方法,将元素自动向下转换到您的子类中,以缩短代码
public static MyElement myElement(Element e) {
return (MyElement) e;
}
// ...
Boolean isTest = myElement(data.getChild("isTest")).getBoolean();
// ...
我可能会创建一个静态类来保存元素的“扩展方法”。这类似于Integer.parseInt(字符串s)
一项实施将是:
public static class MyElement {
public static boolean getBoolean(Element e) {
// Do your thing.
return e.getValue() == "true" || e.getValue() == "1";
}
}
您可以检查元素的实例,看看它是否是MyElement,然后强制转换它。但只有当元素实际属于该实例时,此强制转换才会成功。这意味着您添加了它并将其添加到文档中
希望这能有所帮助。谢谢你的回复,但我在向下广播时遇到了ClassCastException。使用了另一种解决方案。感谢您的回复,但我在向下广播时遇到了ClassCastException。使用了另一个解决方案。谢谢,对于“助手”类,我也有这个想法。不必沮丧(这根本不起作用),它看起来很干净。
public static MyElement myElement(Element e) {
return (MyElement) e;
}
// ...
Boolean isTest = myElement(data.getChild("isTest")).getBoolean();
// ...
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";
}
}