返回超类对象的超类方法

时间:2016-02-11 21:25:38

标签: java superclass return-type

我在解决方案中使用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但是假设你也可以改变超类的方法。

3 个答案:

答案 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实际上是该实例,则此强制转换只会成功。这意味着您添加了它并将其添加到您的文档中。

希望这有帮助。

相关问题