我已经看过相关的问题,但答案仅是我所寻找答案的核心。
我有以下代码行(并且可以编译并运行而没有错误):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.中描述的类型分配?
签出源副本,对其进行更改并构建它。