2016-12-23 182 views
1

我見過相關的問題,但答案只是我尋找的答案的核心。返回的Java方法接口類型

我有下面的代碼行(和它編譯和運行沒有錯誤):

Document doc = dbuilder.parse(myXmlFile);

其中 文獻是接口org.w3c.dom.Documentparse()是從javax.xml.parsers.DocumentBuilder

的方法當我執行時

System.out.println(doc.getClass().getName()); 

其輸出是

com.sun.org.apache.xerces.internal.dom.DeferredDocumentImpl 

其中,我假定,意味着DeferredDocumentImpl實現Document接口,並且當我執行鍼對我的doc變量的方法,我實際執行DeferredDocumentImpl的方法。

我的問題是:

  1. 是,以上假設是正確的,那就是,我是不是真的執行該DeferredDocumentImpl類實現的方法?

  2. 一個接口可以通過任意數量的類實現,並假設org.w3c.dom.Document確實是由多個班級,爲什麼Document類型由parse()返回得到鑄造爲DeferredDocumentImpl類來實現,而不是其他類的一個實施Document

  3. 假設2.上面是某種'默認'或'優先'類型分配,我該在哪裏驗證 - 並可能改變 - 該分配?

  4. 我該如何重寫我在3中描述的類型賦值,在代碼本身的級別上面?

正如我所說,我已經爲此盡職盡責,但似乎沒有任何答案給我這些具體問題的答案......非常感謝。

+0

3.對我來說似乎有點奇怪,關於它沒有任何'默認'或'優先',庫實現者只是簡單地創建了一個實現了'Document'的類,因爲這是他們想要提供的'契約',並且然後實例化該類(la'new DeferredDocumentImpl(...)')作爲'parse'的結果返回。 –

+0

Thx用於響應。所以問題的精神在於:如果庫中的多個類(比如A類除外)實現Document接口,並執行相同的parse(),會發生什麼?當我調用doc.getClass()時,我假設我只會返回A或B(因爲一個對象只能是一個類類型)。它會是哪一個?如何設置它以及在哪裏設置,如果我只激發一個返回一個Document引用的parse(),它將成爲A或B類型的對象?是默認的?,優先?這就是我的意思。任何洞察讚賞。 – Andy

回答

3

我的確在執行那個DeferredDocumentImpl類的實現方法嗎?

一個接口可以通過任意數量的類實現,並假設org.w3c.dom.Document中確實是由多個類實現,爲什麼文件類型通過解析返回( )被轉換爲DeferredDocumentImpl類,而不是實現Document的其他類之一?

您需要閱讀代碼以確定該庫返回該實現的原因。如果它是圖書館唯一的實現,我不會感到驚訝。

注意:org.w3c.dom。Document是一個API標準接口,實現這個API的庫只需要提供一個實現。庫不必從另一個庫創建實現。

假設2.上面是某種'默認'或'優先'類型分配,我該在哪裏驗證 - 並可能改變 - 該分配?

是的,通過修改庫的源來改變庫創建的對象。

我該如何重寫我在3.上面描述的類型分配的代碼本身的級別?

簽出源的副本,更改它並構建它。

+0

Peter,非常感謝您的快速響應 – Andy

+0

Peter,您能不能詳細說說 注意:org.w3c.dom.Document是一個API標準接口,實現這個API的庫只需要提供一個實現。庫不必從另一個庫創建實現。 我正在使用J2SE-1.5;你是否在說如果在該庫中提供了一個接口,它必須至少有一個實現也被提供?當你提到'另一個圖書館'時,這是否意味着com.sun ...圖書館? – Andy

+0

當你實現一個具有接口的API時,你必須提供一個實現它的類,否則你不會實現該API。界面由標準體w3 https://www.w3.org/2003/01/dom2-javadoc/org/w3c/dom/Document.html提供,但它們不提供實施。 JDK具有該接口的實現。順便提一下,Java 5已有十多年的歷史了,是時候升級了。我不知道另一個支持該接口的庫,所以實際上可能只有一個實現。對於Java版本。 –