[英]Java Methods returning Interface types
我已經看過相關的問題,但答案僅是我所尋找答案的核心。
我有以下代碼行(並且可以編譯並運行而沒有錯誤):
Document doc = dbuilder.parse(myXmlFile);
其中Document是接口org.w3c.dom.Document
, parse()
是javax.xml.parsers.DocumentBuilder
的方法
當我然后執行
System.out.println(doc.getClass().getName());
它的輸出是
com.sun.org.apache.xerces.internal.dom.DeferredDocumentImpl
我認為這意味着DeferredDocumentImpl
實現了Document
接口,並且當我針對doc變量執行方法時,實際上是在執行DeferredDocumentImpl的方法。
我的問題是:
以上假設是否正確,也就是說,我確實在執行該DeferredDocumentImpl
類的已實現方法嗎?
一個接口可以由任何數量的類實現,並假設org.w3c.dom.Document
實際上由多個類實現,為什么parse()
返回的Document
類型被parse()
為DeferredDocumentImpl
類,而不是其中之一。其他實現Document
類?
假設2.以上是某種“默認”或“優先”類型分配,我在哪里驗證(可能更改)該分配?
如何在代碼本身的級別上覆蓋我在上文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.