Работа конструкции List list = new ArrayList<>();

List является интерфейсом, и по идее, мы не можем создавать объект типа интерфейс, но почему тогда работает конструкция

List<Integer> list = new ArrayList<>();

ArrayList является классом, здесь понятно, но почему тогда можно создавать объект класса ArrayList типа List, когда мы в принципе не можем создать никакой объект типа интерфейс ?


Ответы (1 шт):

Автор решения: Adm123

Вы создаете объект типа ArrayList, но рассматриваете его как List. Т.е. Вы можете без приведения типа использовать только те его методы, которые переопределяют методы интерфейса List.

Возьмем пример:

List<Integer> list1 = new ArrayList<>();
ArrayList<Integer> list2 = new ArrayList<>();

В таком коде Вы можете воспользоваться методом list2.trimToSize(). А у list1 такого метода нет (вернее - есть, но нужен явный cast). Т.е. объект-то у нас в обоих случаях ArrayList, но рассматриваем мы его в первом случае как просто некий List, а во втором - именно как ArrayList и ничто иное.

В большинстве случаев коллекциям вполне достаточно методов, определяемых соответствующими интерфейсами и подход с объявлением типа как интерфейс - предпочтительный.

→ Ссылка