Это зависит ...
В Java я часто видел рекомендации делать объявления, используя самый высокий уровень абстракции, который можно использовать, хотя это обычно относится к интерфейсам.
Например:
Collection list = new ArrayList();
[loop] list.add(someItem); [end loop]
и т.д.
Зачем? Это позволяет изменить реализацию (деталь в некоторых случаях: некоторые реализации лучше подходят для некоторых применений (очередь, связанный список, стек ...), так что это может быть связано главным образом со скоростью / памятью), сводя к минимуму влияние изменений.
Конечно, если вы используете методы, специфичные для реализации, вы должны быть более конкретны в объявлении.
Еще одно преимущество: когда метод ожидает параметр Collection, он может работать с более широким диапазоном ввода, если ему нужно использовать только общие методы.