返回接口类型的Java方法

时间:2016-12-23 21:47:10

标签: java class types interface implementation

我已经看到了相关的问题,但答案只是我想要的答案的核心。

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

Document doc = dbuilder.parse(myXmlFile);

,其中 文档是界面org.w3c.dom.Documentparse()是来自javax.xml.parsers.DocumentBuilder

的方法

当我执行

System.out.println(doc.getClass().getName());

其输出

com.sun.org.apache.xerces.internal.dom.DeferredDocumentImpl

我认为,这意味着DeferredDocumentImpl实现了Document接口,当我对我的doc变量执行方法时,我实际上是在执行DeferredDocumentImpl的方法。

我的问题是:

  1. 上述假设是否正确,也就是说,我确实在执行DeferredDocumentImpl类的已实现方法吗?

  2. 接口可以由任意数量的类实现,并假设org.w3c.dom.Document确实是由多个类实现的,为什么Document返回的parse()类型会被强制转换作为DeferredDocumentImpl类,而不是实现Document的其他类之一?

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

  4. 如何在代码本身级别覆盖我在上面3.中描述的类型赋值?

  5. 正如我所说的那样,我已经尽职尽责地搜索了这一点,但似乎没有什么能给我这些具体问题的答案......非常感谢。

1 个答案:

答案 0 :(得分:3)

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

  

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

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

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

  

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

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

  

如何在代码本身级别覆盖我在上面3.中描述的类型赋值?

签出源的副本,更改并构建它。