Java: интерфейс с новым ключевым словом, как это возможно?
Я читал некоторый исходный код из библиотек Java, и здесь я смущен;
Этот код из Document.java в библиотеке jaxb, а ContentVisitor - это интерфейс в том же пакете, как мы можем создать экземпляр интерфейса с новым ключевым словом? не является незаконным?
public final class Document {
.
.
private final ContentVisitor visitor = new ContentVisitor() {
public void onStartDocument() {
throw new IllegalStateException();
}
public void onEndDocument() {
out.endDocument();
}
public void onEndTag() {
out.endTag();
inscopeNamespace.popContext();
activeNamespaces = null;
}
}
Ответы
Ответ 1
В коде вы не создаете экземпляр интерфейса. Скорее, код определяет анонимный класс, реализующий интерфейс, и создает экземпляр этого класса.
Код примерно эквивалентен:
public final class Document {
private final class AnonymousContentVisitor implements ContentVisitor {
public void onStartDocument() {
throw new IllegalStateException();
}
public void onEndDocument() {
out.endDocument();
}
public void onEndTag() {
out.endTag();
inscopeNamespace.popContext();
activeNamespaces = null;
}
}
private final ContentVisitor visitor = new AnonymousContentVisitor();
}
Ответ 2
Это действительно. Он называется Анонимный класс. Смотрите здесь
Мы уже видели примеры синтаксиса для определения и создания экземпляра анонимного класса. Мы можем выразить этот синтаксис более формально следующим образом:
new class-name ( [ argument-list ] ) { class-body }
или
new interface-name () { class-body }
Ответ 3
Он называется anonymous
type/class, который реализует этот интерфейс. Взгляните на учебник - Локальные и анонимные внутренние классы.
Ответ 4
Это объявление фактически создает новый анонимный класс, который реализует интерфейс ContentVisitor
, а затем его экземпляр для этой заданной области действия и совершенно корректен.
Ответ 5
Там что-то называется анонимным классом в java http://www.java2s.com/Code/Java/Class/Anonymous-class.htm
Ответ 6
Обратите внимание, где открываются фигурные скобки - вы объявляете внутренний объект (называемый anonymous class
), который реализует ContentVisitor
и все необходимые методы на месте!
Ответ 7
Это встроенная реализация интерфейса. Идея заключается в том, чтобы компилятор сгенерировал анонимный класс, который реализует интерфейс. Затем для каждого метода, определенного в интерфейсе, вы можете (необязательно) предоставить метод с подходящей сигнатурой, которая будет использоваться в качестве реализации метода интерфейса.
Это новый синтаксис Oxygene, добавленный к языку, позволяющий программистам Oxygene работать с этими событиями на основе интерфейса во многом так же, как и Java-программисты.
Ответ 8
Фактически вы только что предоставили реализацию этого интерфейса анонимным способом. Это довольно часто и, конечно, возможно. Посмотрите здесь для получения дополнительной информации.