2016-02-11 221 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