我已经看到了相关的问题,但答案只是我想要的答案的核心。
我有以下代码行(并且编译并运行时没有错误):
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.中描述的类型赋值?
正如我所说的那样,我已经尽职尽责地搜索了这一点,但似乎没有什么能给我这些具体问题的答案......非常感谢。
答案 0 :(得分:3)
我确实在执行DeferredDocumentImpl类的已实现方法吗?
是
接口可以由任意数量的类实现,并且假设org.w3c.dom.Document确实由多个类实现,为什么parse()返回的Document类型被转换为DeferredDocumentImpl类,而不是实现Document的其他类之一?
您需要阅读代码以确定该库返回该实现的原因。如果它是库的唯一实现,我不会感到惊讶。
注意:org.w3c.dom.Document是一个API标准接口,实现此API的库只需提供一个实现。库不必从另一个库创建实现。
假设2.上面是某种“默认”或“优先”类型分配,我在哪里验证 - 并可能更改 - 该分配?
是的,通过修改库的来源来更改库创建的对象。
如何在代码本身级别覆盖我在上面3.中描述的类型赋值?
签出源的副本,更改并构建它。