【问题标题】:Java Methods returning Interface types返回接口类型的 Java 方法
【发布时间】:2017-05-09 13:23:43
【问题描述】:

我看过相关的问题,但答案只是绕过了我正在寻找的答案的核心。

我有以下代码行(它编译和运行没有错误):

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确实由多个类实现,为什么parse()返回的Document类型会被转换为DeferredDocumentImpl类,而不是实现Document的其他类之一?

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

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

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

【问题讨论】:

  • 3.对我来说似乎有点奇怪,它没有任何“默认”或“优先级”,库实现者只是创建了一个实现 Document 的类,因为这是他们想要提供的“合同”,然后实例化该类( a la new DeferredDocumentImpl(...)) 作为 parse 的结果返回。
  • 感谢您的回复。所以问题的精神是这样的:如果库中的多个类(例如,除了类 A 之外的类 B)实现 Document 接口,我执行相同的 parse() 会发生什么?当我调用 doc.getClass() 时,我假设我只会返回 A 或 B(因为对象只能是一种类类型)。会是哪一个?如果我只触发返回 Document 引用的 parse(),它将如何以及在哪里设置,它将是 A 或 B 类型的对象?一个是默认的吗?优先级?这就是我的意思。任何见解表示赞赏。

标签: java class types interface implementation


【解决方案1】:

我是否确实在执行该 DeferredDocumentImpl 类的已实现方法?

是的

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

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

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

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

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

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

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

【讨论】:

  • Peter,你能详细说明一下吗 注意:org.w3c.dom.Document 是一个 API 标准接口,实现这个 API 的库只需要提供一个实现。库不必从另一个库创建实现。我正在使用 J2SE-1.5;你是说如果在那个库中提供了一个接口,那么至少还必须提供它的一个实现?当您提到“另一个库”时,是指 com.sun... 库吗?
  • 当你实现一个有接口的 API 时,你必须提供一个实现它的类,否则你就没有实现那个 API。该接口由标准主体 w3 w3.org/2003/01/dom2-javadoc/org/w3c/dom/Document.html 提供,但它们不提供实现。 JDK 具有该接口的实现。顺便说一句,Java 5 已经有十多年的历史了,是时候升级了。我不知道支持该接口的另一个库,所以实际上可能只有一个实现。对于 Java 版本。
  • 确实!这是大约六年前的一个旧项目;我只是在另一个上下文中重新审视它非常感谢您的回复,非常有帮助。
猜你喜欢
  • 2019-02-10
  • 1970-01-01
  • 2011-05-16
  • 1970-01-01
  • 1970-01-01
  • 2018-02-23
  • 1970-01-01
  • 2011-01-25
  • 1970-01-01
相关资源
最近更新 更多