Java: интерфейс с новым ключевым словом, как это возможно? - PullRequest
51 голосов
/ 06 февраля 2012

Я читал некоторый исходный код из библиотек 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;
    }
}

Ответы [ 8 ]

53 голосов
/ 06 февраля 2012

В коде вы не создаете экземпляр интерфейса. Скорее код определяет анонимный класс, который реализует интерфейс, и создает экземпляр этого класса.

Код примерно эквивалентен:

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();
}
12 голосов
/ 06 февраля 2012

Это действительно. Это называется анонимный класс. Смотрите здесь

Мы уже видели примеры синтаксиса для определения и создания анонимного класса. Мы можем выразить этот синтаксис более формально как:

new class-name ( [ argument-list ] ) { class-body }

или

new interface-name () { class-body }
2 голосов
/ 06 февраля 2012

Он называется anonymous тип / класс, который реализует этот интерфейс. Взгляните на учебник - Локальные и анонимные внутренние классы .

1 голос
/ 06 февраля 2012

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

0 голосов
/ 06 февраля 2012

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

0 голосов
/ 06 февраля 2012

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

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

0 голосов
/ 06 февраля 2012

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

0 голосов
/ 06 февраля 2012

В java есть нечто, называемое анонимным классом http://www.java2s.com/Code/Java/Class/Anonymous-class.htm

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...