интерфейс Java без реализации
Вопрос
Я недавно сталкиваюсь с этим кодом ниже при изучении Javafx, я вижу, что Наблюдатель Является ли интерфейс, и нет его реализации, как вы можете использовать его переменную? Очевидно, что я что -то упускаю здесь, может ли кто -нибудь указать мне на правильное направление?
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! "); } });
Решение
Я думаю этот код:
FXCollections.observableList(list);
означает, что этот метод получает реализацию интерфейса, вы можете загрузить источник, чтобы проверить его.
Другие советы
А FXCollections.observableList()
Метод возвращает экземпляр класса, который реализует этот интерфейс. Вы не видите имя этого класса здесь, но вам не нужно видеть его (или действительно, нужно даже знать, что это такое.) В этом вся смысл полиморфизма-объектно-ориентированного программирования: вы , клиент, имеет дело только с интерфейсом; У кого -то другое - создать фактический класс или набор классов, которые реализуют его. Если вы получите это одно очко, то у вас есть ручка к вещам.
Конечно, вы можете использовать переменную с типом интерфейса: вы просто не можете истентный это (нет призвания new ObservableList()
), но любой экземпляр класса, который реализует этот интерфейс, действителен для этой переменной.
Поскольку я не могу объяснить это лучше, тогда, посмотрите на это объяснение: Использование интерфейсов в качестве переменных
FXCollections.observableList()
Должен вернуть экземпляр конкретного класса, или null
.
Если присутствующий код действительно работает, результат не может быть null
Поскольку в этом случае observableList.addListener(...)
бросил бы NullPointerException
.
Из этого следует, что FXCollections.observableList()
возвращает неnull
ссылка.
Следовательно, предположение, что «нет реализации [ObservableList
] 'ошибочно: должна быть реализация ObservableList
где-то. Возможно, у вас нет доступа к этому, но это, безусловно, существует.
Если вы можете, посмотрите на исходный код для FXCollections.observableList()
.
Да, как верхний говорит .... метод fxcollections.observablelist () возвращает экземпляр класса, который реализует интерфейс наблюдений ...... t
http://docs.oracle.com/javafx/2.0/api/javafx/collections/observablelist.html
Это интерфейс, и FXCollections.observableList()
возвращает объект, который реализует его вам. В Javadoc вы заметите, что ObservableList
расширяется Observable
... что где addListener()
происходит от.
Реализация анонимный класс.