Я видел связанные вопросы, но ответы только охватывают сердце ответа, который я ищу.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.
Мои вопросы:
Это выше предположение правильно, то есть, я на самом деле выполнения реализованных методов этого класса
DeferredDocumentImpl
?Интерфейс может быть реализована любым числом классов, и предполагая, что
org.w3c.dom.Document
действительно реализуется несколько классов, почемуDocument
типа возвращаемыхparse()
извергается какDeferredDocumentImpl
класса, а не один из других классов, реализуетDocument
?Предполагая, что 2. выше является своего рода присвоением типа «по умолчанию» или «приоритет», где я могу проверить - и, возможно, изменить - это присвоение?
Как бы я переопределял назначение типа, которое я описываю в 3. выше, на уровне самого кода?
Как я уже сказал, я искал послушно для этого, но ничто, кажется, не дает мне ответов на эти конкретные вопросы ... высоко ценится.
3. Мне кажется странным, в нем нет ничего «по умолчанию» или «приоритета», разработчики библиотеки просто создали класс, который реализует «Документ», поскольку это «контракт», который они хотят предоставить, и затем создайте экземпляр этого класса (a la 'new DeferredDocumentImpl (...)') для возврата в результате 'parse'. –
Thx для ответа. Итак, дух вопроса таков: что происходит, если более одного класса (скажем, класс B в дополнение к классу A) в библиотеке реализует интерфейс Document, и я выполняю тот же синтаксический анализ(); когда я вызываю doc.getClass(), я предполагаю, что я верну только A или B (поскольку объект может иметь только один тип класса). Кто это будет? Как и где он установлен, если я только запускаю parse(), который возвращает ссылку Document, что это будет объект типа A или B? Один ли по умолчанию ?, приоритет? Вот что я имел в виду. Любое понимание было оценено. – Andy