Java-интерфейс без реализации - PullRequest
1 голос
/ 10 января 2012

Я недавно столкнулся с этим кодом ниже при изучении javafx, я вижу, что ObservableList - это интерфейс, и его реализация не реализована, как вы можете использовать его переменную?Очевидно, я что-то здесь упускаю, кто-нибудь может указать мне правильное направление?

    List list = new ArrayList();

    ObservableList observableList = FXCollections.observableList(list);
    observableList.addListener(new ListChangeListener() {
        @Override
        public void onChanged(ListChangeListener.Change change) {
            System.out.println("Detected a change! ");
        }
    });

Ответы [ 8 ]

6 голосов
/ 10 января 2012

Метод FXCollections.observableList() возвращает экземпляр класса, который реализует этот интерфейс.Вы не видите здесь имя этого класса, но вам не нужно его видеть (или даже знать, что это такое). В этом весь смысл полиморфизма - объектно-ориентированного программирования: выклиент, имеет дело только с интерфейсом;это чья-то работа по созданию реального класса или набора классов, которые его реализуют.Если вы получите это одно очко, значит, у вас есть контроль над вещами.

0 голосов
/ 10 января 2012

Я думаю, что этот код:

FXCollections.observableList(list);

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

0 голосов
/ 10 января 2012

Реализация представляет собой анонимный класс .

0 голосов
/ 10 января 2012

http://docs.oracle.com/javafx/2.0/api/javafx/collections/ObservableList.html

Это интерфейс, и FXCollections.observableList() возвращает объект, который его реализует. В JavaDoc вы заметите, что ObservableList расширяет Observable ... отсюда addListener().

0 голосов
/ 10 января 2012

да, как говорят верхние .... метод FXCollections.observableList () возвращает экземпляр класса, который реализует интерфейс ObservableList ...... t

0 голосов
/ 10 января 2012

FXCollections.observableList() должен возвращать экземпляр конкретного класса или null.

Если код, который вы представляете, действительно работает, результат не может быть null, поскольку в этом случае observableList.addListener(...) выдаст NullPointerException.

Из этого следует, что FXCollections.observableList() возвращает не-null ссылку.

Следовательно, предположение о том, что «реализации [ObservableList] нет», ошибочно: где-то должна быть реализация ObservableList. Возможно, у вас нет доступа к нему, но он, безусловно, существует.

Если можете, посмотрите на исходный код FXCollections.observableList().

0 голосов
/ 10 января 2012

Поскольку я не могу объяснить это лучше, чем здесь, взгляните на это объяснение: с использованием интерфейсов в качестве переменных

0 голосов
/ 10 января 2012

Конечно, вы можете использовать переменную с типом интерфейса: вы просто не можете истанировать ее (без вызова new ObservableList()), но любой экземпляр класса, реализующий этот интерфейс, действителендля этой переменной.

...