簡體   English   中英

返回接口類型的Java方法

[英]Java Methods returning Interface types

我已經看過相關的問題,但答案僅是我所尋找答案的核心。

我有以下代碼行(並且可以編譯並運行而沒有錯誤):

Document doc = dbuilder.parse(myXmlFile);

其中Document是接口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實際上由多個類實現,為什么parse()返回的Document類型被parse()DeferredDocumentImpl類,而不是其中之一。其他實現Document類?

  3. 假設2.以上是某種“默認”或“優先”類型分配,我在哪里驗證(可能更改)該分配?

  4. 如何在代碼本身的級別上覆蓋我在上文3.中描述的類型分配?

正如我所說的,我已經盡職盡責地尋找了這個,但是似乎沒有什么能給我這些具體問題的答案……非常感謝。

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

一個接口可以由任何數量的類實現,並假設org.w3c.dom.Document實際上由多個類實現,為什么parse()返回的Document類型被強制轉換為DeferredDocumentImpl類,而不是其中之一。其他實現Document的類?

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

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

假設2.以上是某種“默認”或“優先”類型分配,我在哪里驗證(可能更改)該分配?

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

如何在代碼本身的級別上覆蓋我在上文3.中描述的類型分配?

簽出源副本,對其進行更改並構建它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM