Java 返回超类对象的超类方法

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返回一个元素对象(由超类实现),而超类又不知道子类方法 从我在其他问题中读到的内容来

我正在解决方案中使用JDOM库。
我创建了以下类,因为我想增加一些功能(主要是
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";
    }
}