2016-12-23 162 views
1

我见过相关的问题,但答案只是我寻找的答案的核心。返回的Java方法接口类型

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

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中描述的类型赋值,在代码本身的级别上面?

正如我所说,我已经为此尽职尽责,但似乎没有任何答案给我这些具体问题的答案......非常感谢。

+0

3.对我来说似乎有点奇怪,关于它没有任何'默认'或'优先',库实现者只是简单地创建了一个实现了'Document'的类,因为这是他们想要提供的'契约',并且然后实例化该类(la'new DeferredDocumentImpl(...)')作为'parse'的结果返回。 –

+0

Thx用于响应。所以问题的精神在于:如果库中的多个类(比如A类除外)实现Document接口,并执行相同的parse(),会发生什么?当我调用doc.getClass()时,我假设我只会返回A或B(因为一个对象只能是一个类类型)。它会是哪一个?如何设置它以及在哪里设置,如果我只激发一个返回一个Document引用的parse(),它将成为A或B类型的对象?是默认的?,优先?这就是我的意思。任何洞察赞赏。 – Andy

回答

3

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

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

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

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

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

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

我该如何重写我在3.上面描述的类型分配的代码本身的级别?

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

+0

Peter,非常感谢您的快速响应 – Andy

+0

Peter,您能不能详细说说 注意:org.w3c.dom.Document是一个API标准接口,实现这个API的库只需要提供一个实现。库不必从另一个库创建实现。 我正在使用J2SE-1.5;你是否在说如果在该库中提供了一个接口,它必须至少有一个实现也被提供?当你提到'另一个图书馆'时,这是否意味着com.sun ...图书馆? – Andy

+0

当你实现一个具有接口的API时,你必须提供一个实现它的类,否则你不会实现该API。界面由标准体w3 https://www.w3.org/2003/01/dom2-javadoc/org/w3c/dom/Document.html提供,但它们不提供实施。 JDK具有该接口的实现。顺便提一下,Java 5已有十多年的历史了,是时候升级了。我不知道另一个支持该接口的库,所以实际上可能只有一个实现。对于Java版本。 –