【发布时间】:2017-05-09 13:23:43
【问题描述】:
我看过相关的问题,但答案只是绕过了我正在寻找的答案的核心。
我有以下代码行(它编译和运行没有错误):
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确实由多个类实现,为什么parse()返回的Document类型会被转换为DeferredDocumentImpl类,而不是实现Document的其他类之一?假设 2. 以上是某种“默认”或“优先”类型分配,我在哪里验证 - 并可能更改 - 该分配?
如何在代码本身的级别覆盖我在上面 3. 中描述的类型分配?
正如我所说,我已经尽职尽责地搜索了这个,但似乎没有什么能给我这些具体问题的答案......非常感谢。
【问题讨论】:
-
3.对我来说似乎有点奇怪,它没有任何“默认”或“优先级”,库实现者只是创建了一个实现
Document的类,因为这是他们想要提供的“合同”,然后实例化该类( a lanew DeferredDocumentImpl(...)) 作为parse的结果返回。 -
感谢您的回复。所以问题的精神是这样的:如果库中的多个类(例如,除了类 A 之外的类 B)实现 Document 接口,我执行相同的 parse() 会发生什么?当我调用 doc.getClass() 时,我假设我只会返回 A 或 B(因为对象只能是一种类类型)。会是哪一个?如果我只触发返回 Document 引用的 parse(),它将如何以及在哪里设置,它将是 A 或 B 类型的对象?一个是默认的吗?优先级?这就是我的意思。任何见解表示赞赏。
标签: java class types interface implementation