0 added
0 removed
Original
2026-01-01
Modified
2026-02-26
1
<p>На примере коллекций, мы первый раз столкнулись с типами данных, которые завязаны на интерфейс и имеют несколько его реализаций. Определение свойств и методов с такой структурой отличается от того, как мы до этого работали с примитивными типами.</p>
1
<p>На примере коллекций, мы первый раз столкнулись с типами данных, которые завязаны на интерфейс и имеют несколько его реализаций. Определение свойств и методов с такой структурой отличается от того, как мы до этого работали с примитивными типами.</p>
2
<p>Рассмотрим пример, когда мы работаем с числами или строками, то определяем свойства и методы соответственно:</p>
2
<p>Рассмотрим пример, когда мы работаем с числами или строками, то определяем свойства и методы соответственно:</p>
3
<p>Здесь мы указываем ровно тот тип, про который мы думаем. Применим такой же подход к спискам. Создадим класс пользователя, у которого есть возможность добавлять друзей:</p>
3
<p>Здесь мы указываем ровно тот тип, про который мы думаем. Применим такой же подход к спискам. Создадим класс пользователя, у которого есть возможность добавлять друзей:</p>
4
<p>Пока все выглядит отлично, но посмотрите на возможный пример использования.</p>
4
<p>Пока все выглядит отлично, но посмотрите на возможный пример использования.</p>
5
<p>Этот код не скомпилируется, потому что тип переменной friends будет List<User>, а не ArrayList<User> как ожидается. Правильным выходом из этой ситуации будет завязка не на конкретную реализацию ArrayList, а на интерфейс List.</p>
5
<p>Этот код не скомпилируется, потому что тип переменной friends будет List<User>, а не ArrayList<User> как ожидается. Правильным выходом из этой ситуации будет завязка не на конкретную реализацию ArrayList, а на интерфейс List.</p>
6
<p>Почему именно так? Фактически в этом и есть смысл интерфейсов. Реализация может поменяться, но код от этого меняться не должен, если интерфейс не меняется. Код выше работает с любой конкретной реализацией:</p>
6
<p>Почему именно так? Фактически в этом и есть смысл интерфейсов. Реализация может поменяться, но код от этого меняться не должен, если интерфейс не меняется. Код выше работает с любой конкретной реализацией:</p>
7
<p>Сегодня мы решили использовать ArrayList, а завтра захотели поменять его на LinkedList, потому что так будет эффективнее. Код по-прежнему будет работать:</p>
7
<p>Сегодня мы решили использовать ArrayList, а завтра захотели поменять его на LinkedList, потому что так будет эффективнее. Код по-прежнему будет работать:</p>
8
8