我已经看过相关的问题,但答案仅是我所寻找答案的核心。

我有以下代码行(并且可以编译并运行而没有错误):

Document doc = dbuilder.parse(myXmlFile);

哪里
文档是界面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确实由多个类实现,为什么Document返回的parse()类型被强制转换为DeferredDocumentImpl类,而不是其中之一?实现Document的其他类?
假设2.以上是某种“默认”或“优先”类型分配,我在哪里验证(可能更改)该分配?
如何在代码本身的级别上覆盖我在上文3.中描述的类型分配?


就像我说的那样,我已经尽职尽责地寻找了这个,但是似乎没有什么能给我这些具体问题的答案……非常感谢。

最佳答案

我确实在执行那个DeferredDocumentImpl类的实现方法吗?





  一个接口可以由任何数量的类实现,并且假定org.w3c.dom.Document实际上由多个类实现,为什么parse()返回的Document类型被强制转换为DeferredDocumentImpl类,而不是其中之一。其他实现Document的类?


您将需要阅读代码以确定该库为何返回该实现。如果它是库唯一的实现,我不会感到惊讶。

注意:org.w3c.dom.Document是API标准接口,实现此API的库仅需提供一个实现。一个库不必从另一个库创建实现。


  假设2.以上是某种“默认”或“优先”类型分配,我在哪里验证(可能更改)该分配?


是的,通过修改库的源来更改库创建的对象。


  如何在代码本身的级别上覆盖我在上文3.中描述的类型分配?


签出源副本,对其进行更改并构建它。

10-07 18:59
查看更多