Подтвердить что ты не робот

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;
    }
}
4b9b3361

Ответ 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 }

Ответ 4

Это объявление фактически создает новый анонимный класс, который реализует интерфейс ContentVisitor, а затем его экземпляр для этой заданной области действия и совершенно корректен.

Ответ 6

Обратите внимание, где открываются фигурные скобки - вы объявляете внутренний объект (называемый anonymous class), который реализует ContentVisitor и все необходимые методы на месте!

Ответ 7

Это встроенная реализация интерфейса. Идея заключается в том, чтобы компилятор сгенерировал анонимный класс, который реализует интерфейс. Затем для каждого метода, определенного в интерфейсе, вы можете (необязательно) предоставить метод с подходящей сигнатурой, которая будет использоваться в качестве реализации метода интерфейса.

Это новый синтаксис Oxygene, добавленный к языку, позволяющий программистам Oxygene работать с этими событиями на основе интерфейса во многом так же, как и Java-программисты.

Ответ 8

Фактически вы только что предоставили реализацию этого интерфейса анонимным способом. Это довольно часто и, конечно, возможно. Посмотрите здесь для получения дополнительной информации.