Это настоящий вопрос для начинающих (я все еще изучаю основы Java).Почему переменные объявлены с их именем интерфейса в Java?
Я (вроде) понять, почему методы будут возвращать список < строку >, а не ArrayList < строки >, или почему они принимают параметр List, а не в ArrayList. Если это не имеет никакого значения для метода (то есть, если не требуются специальные методы из ArrayList), это сделает метод более гибким и более простым в использовании для вызывающих. То же самое относится к другим типам коллекций, таким как Set или Map.
То, что я не понимаю: это, кажется, обычная практика для создания локальных переменных, как это:
List<String> list = new ArrayList<String>();
В то время как эта форма встречается реже:
ArrayList<String> list = new ArrayList<String>();
В чем преимущество здесь?
Все, что я вижу, является незначительным недостатком: отдельная строка импорта для java.util.List необходимо добавить. Технически «import java.util. *» Можно использовать, но я не вижу этого очень часто, возможно, потому, что строки «импорта» автоматически добавляются некоторой средой IDE.
Это абстрактофилия. Эффективность одной реализации по сравнению с другой зависит от кода, который _uses_ переменной: я не вижу, что когда-нибудь захочу что-нибудь, кроме плотной связи между ними. –
«Я не вижу, что мне когда-либо понадобится что-то, кроме плотной связи между ними». Разве не вся концепция интерфейсов основана на том, что вы на самом деле хотите получить свободную связь? –
Конечно.Но когда вам нужна свободная связь между работой функции и ее локальными переменными? Особенно при выборе реализации коллекции, поскольку коллекции часто оптимизируются для конкретных ситуаций. –