2017-05-31 12 views
0

私のアプリケーションで作業コードをクリーンアップする作業をしていて、私がコード内の複数の場所にあるXPathFactoryXPathXPathExpressionオブジェクトを再利用していたことに気付きました。これをする。私が気づいたのは、通常、XML文書をXPathExpression.evalutateメソッドに送信するときに、このようなソースのパラメータにXML文書を置くだけだということです。XPathExpression.evalutateメソッドに渡すときにDocumentオブジェクトをキャストする必要がないのはなぜですか?

DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance(); 
Document builder = builderFactory.newDocumentBuilder(); 
Document document = builder.parse(new FileReader("/path/to/file.xml")); 

XPathFactory factory = XPathFactory.newInstance(); 
XPath xpath = factory.newXPath(); 
XPathExpression expression = xpath.compile("path/to/node"); 
Object result = expression.evaluate(document, XPathConstants.NODE); 

これは、それが動作することを結構ですが、私はこのような別の方法にXPathの部分をラップしようとすると:

private Object getObjectByExpression(String expr, InputSource source, QName objectType) 
{ 
    XPathFactory factory = XPathFactory.newInstance(); 
    XPath xpath = factory.newXPath(); 
    XPathExpression expression = xpath.compile(expr); 
    Object result = expression.evaluate(document, objectType); 
    return result; 
} 

public void someCalledMethod() 
{ 
    DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance(); 
    Document builder = builderFactory.newDocumentBuilder(); 
    Document document = builder.parse(new FileReader("/path/to/file.xml")); 

    Object result = getObjectByExpression("/path/to/node", document, XPathConstants.NODE); 
} 

Eclipseは私がInputSourcedocumentをキャストしなければならないことを私に伝えて、それをマークエラーとして。私はXPathExpression.evaluateで使用されているInputSourceと私のメソッドで使用されているInputSourceが同じクラスタイプであることを再確認しました。この不一致がどこから来るのか、誰にも深い理解がありますか?

答えて

1

実際には、DocumentではXPathExpression.evaluate(Object, QName)メソッドを使用しています。

Documentはインターフェイスなので、クラスInputSourceを継承することはできません。それは不可能。あなたのメソッドを更新する必要がある理由はここにある:

private Object getObjectByExpression(String expr, Object source, QName objectType) 

それとも、本当にDocument

private Object getObjectByExpression(String expr, Document source, QName objectType) 
+0

おかげ@AxelHにこれを制限したい場合は、私は明らかに盲目だとあったことがわかりませんでした複数のメソッドシグネチャ。私は今、少しばかげているように感じます。 – JRSofty

+0

@JRSofty eclipseを使用すると、 +メソッドを左クリックしてクラスの宣言を開くことができます。メソッドをすばやくチェックすると便利です。メソッドをホバーすることでjavadocを確認するだけで、 'InputSource'ではなく' Object'メソッドであることがわかります;)他のIDEのショートカットについてはわかりません – AxelH

+0

@ JRSoftyは、あなたの問題を解決している場合には、答えることを躊躇しないでください。または他の人を待つことを自由に感じてください;) – AxelH

関連する問題