2016-12-23 2 views
1

Я видел связанные вопросы, но ответы только охватывают сердце ответа, который я ищу.Java-методы, возвращающие типы интерфейсов

У меня есть следующие строки кода (и это компилируется и выполняется без ошибок):

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, и что, когда я исполняю методы против моего переменного дока, я на самом деле выполнением методов DeferredDocumentImpl.

Мои вопросы:

  1. Это выше предположение правильно, то есть, я на самом деле выполнения реализованных методов этого класса DeferredDocumentImpl?

  2. Интерфейс может быть реализована любым числом классов, и предполагая, что org.w3c.dom.Document действительно реализуется несколько классов, почему Document типа возвращаемых parse() извергается как DeferredDocumentImpl класса, а не один из других классов, реализует Document?

  3. Предполагая, что 2. выше является своего рода присвоением типа «по умолчанию» или «приоритет», где я могу проверить - и, возможно, изменить - это присвоение?

  4. Как бы я переопределял назначение типа, которое я описываю в 3. выше, на уровне самого кода?

Как я уже сказал, я искал послушно для этого, но ничто, кажется, не дает мне ответов на эти конкретные вопросы ... высоко ценится.

+0

3. Мне кажется странным, в нем нет ничего «по умолчанию» или «приоритета», разработчики библиотеки просто создали класс, который реализует «Документ», поскольку это «контракт», который они хотят предоставить, и затем создайте экземпляр этого класса (a la 'new DeferredDocumentImpl (...)') для возврата в результате 'parse'. –

+0

Thx для ответа. Итак, дух вопроса таков: что происходит, если более одного класса (скажем, класс B в дополнение к классу A) в библиотеке реализует интерфейс Document, и я выполняю тот же синтаксический анализ(); когда я вызываю doc.getClass(), я предполагаю, что я верну только A или B (поскольку объект может иметь только один тип класса). Кто это будет? Как и где он установлен, если я только запускаю parse(), который возвращает ссылку Document, что это будет объект типа A или B? Один ли по умолчанию ?, приоритет? Вот что я имел в виду. Любое понимание было оценено. – Andy

ответ

3

Я действительно выполняю реализованные методы этого класса DeferredDocumentImpl?

да

Интерфейс может быть реализован любым числом классов, и при условии, что org.w3c.dom.Document действительно реализуются несколько классов, почему типа документа, возвращенный разбор () получить cast как класс DeferredDocumentImpl, а не один из других классов, реализующих Document?

Вам нужно будет прочитать код, чтобы определить, почему эта библиотека вернула эту реализацию. Я не удивлюсь, если это единственная реализация, которую имеет библиотека.

Примечание: org.w3c.dom.Документ является стандартным интерфейсом API, библиотека, которая реализует этот API, должна обеспечивать только одну реализацию. Библиотеке не нужно создавать реализацию из другой библиотеки.

Предполагая, что 2. выше является своего рода присвоением типа «по умолчанию» или «приоритет», где я могу проверить и, возможно, изменить это присвоение?

Да, измените объект, созданный библиотекой, изменив источник библиотеки.

Как бы я переопределял назначение типа, которое я описываю в 3. выше, на уровне самого кода?

Оформить заказ копию оригинала, сменить его и построить.

+0

Peter, большое спасибо за быстрый ответ – Andy

+0

Питер, можете ли вы подробно остановиться на Примечание: 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. –

Смежные вопросы