Работа конструкции List list = new ArrayList<>();
List является интерфейсом, и по идее, мы не можем создавать объект типа интерфейс, но почему тогда работает конструкция
List<Integer> list = new ArrayList<>();
ArrayList является классом, здесь понятно, но почему тогда можно создавать объект класса ArrayList типа List, когда мы в принципе не можем создать никакой объект типа интерфейс ?
Ответы (1 шт):
Вы создаете объект типа ArrayList, но рассматриваете его как List. Т.е. Вы можете без приведения типа использовать только те его методы, которые переопределяют методы интерфейса List.
Возьмем пример:
List<Integer> list1 = new ArrayList<>();
ArrayList<Integer> list2 = new ArrayList<>();
В таком коде Вы можете воспользоваться методом list2.trimToSize(). А у list1 такого метода нет (вернее - есть, но нужен явный cast).
Т.е. объект-то у нас в обоих случаях ArrayList, но рассматриваем мы его в первом случае как просто некий List, а во втором - именно как ArrayList и ничто иное.
В большинстве случаев коллекциям вполне достаточно методов, определяемых соответствующими интерфейсами и подход с объявлением типа как интерфейс - предпочтительный.