2016-02-11 131 views
0

我在解决方案中使用JDOM库。
我创建了以下类,因为我想添加功能(主要是用于从XML元素解析特定类型数据的get方法)。超类方法返回超类对象

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方法,但是也会需要downcast,对吧?

是否可以使用或覆盖超类方法,以便返回的Element对象可以看作MyElement对象?

我找到了this question,但假设你也可以改变超类的方法。

回答

0

我可能会让一个静态类来容纳元素的“扩展方法”。这与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"; 
    } 
} 

你可以检查元素的情况下,看它是否是MyElement,然后将它转换。但是如果元素实际上是这个实例的话,这个投射只会成功。这意味着您添加了它并将其添加到您的文档中。

希望这会有所帮助。

+0

谢谢,我也有过这个想法,对于“帮手”类。不必沮丧(反正无法工作),它看起来很干净。 – FDM

0

如果您可以将@Overrides注释添加到该方法,并且编译器不会投诉,即使定义了Element.getBoolean(),也会调用您的方法。

public class MyElement extends Element { 
    @Override 
    public Boolean getBoolean() { 
     ... whatever there was before, My element will return this ... 
     return true; 
    } 
} 

如果您不能添加@覆盖,然后Element没有getBoolean()方法,正因为如此,当你做

data.getChild("isTest") 

您将收到一条Element可能恰好是一个MyElement ,但它可能是别的。虽然它不是在所有情况下,最好的办法,有时是适当的垂头丧气

Element element = data.getChild("isTest"); 
Boolean boolValue; 
if (element instanceof MyElement) { 
    boolValue= ((MyElement)element).getBoolean(); 
} else { 
    boolValue= Boolean.FALSE; 
} 

我故意回答不考虑实际Element类型,这是更为重要的是理解,而不是规则理解这些规则,因为它们只适用于特定的类。

祝你好运!

+0

感谢您的回复,但在向下转换时出现ClassCastException。采取另一种解决方案。 – FDM

0

是的,你可以重写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(); 
// ... 
+0

感谢您的回复,但在向下转换时出现ClassCastException。采取另一种解决方案。 – FDM