Java: Списки
2026-02-26 18:10 Diff

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

Рассмотрим пример, когда мы работаем с числами или строками, то определяем свойства и методы соответственно:

Здесь мы указываем ровно тот тип, про который мы думаем. Применим такой же подход к спискам. Создадим класс пользователя, у которого есть возможность добавлять друзей:

Пока все выглядит отлично, но посмотрите на возможный пример использования.

Этот код не скомпилируется, потому что тип переменной friends будет List<User>, а не ArrayList<User> как ожидается. Правильным выходом из этой ситуации будет завязка не на конкретную реализацию ArrayList, а на интерфейс List.

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

Сегодня мы решили использовать ArrayList, а завтра захотели поменять его на LinkedList, потому что так будет эффективнее. Код по-прежнему будет работать: