Основное отличие состоит в том, что в первом вы говорите, что тип l1
является интерфейсом List<T>
, тогда как во втором случае, типа l2
является конкретной реализацией (из List<T>
) ArrayList<T>
.
Я хотел бы использовать первую форму:
List<String> l1 = new ArrayList<String>();
типа с использованием интерфейсов, так что вы можете переключаться реализаций легко позже. Вторая реализация тесно связана с реализацией List
. Поэтому, если вы захотите позже изменить реализации (скажем, LinkedList<T>
), у вас будет много рефакторинга (изменение подписи методов и т. Д.). Однако, если вы использовали первый подход, вы можете просто заменить реализацию, не требуя дополнительного рефакторинга.
Использование интерфейса также заставляет вас кодировать код договора интерфейса, чем любая конкретная конкретная реализация.
3. «Список l3 = новый ArrayList <>();' начиная с Java7. –
Pshemo