Очень часто замечаю, что создают child объекты по parent ссылке.
Например: Set <String> hashSet = new HashSet<>();
Почему не пишут вот так? HashSet <String> hashSet = new HashSet<>();
В чем преимущества первого подхода, что все пишут именно так?
Я понимаю что это полиморфная ссылка и что если мы создаем объект таким образом, то будем иметь доступ к методам родителя и переопределенным методам наследника, но не всем остальным методам наследника. Зачем заранее сужать функционал объекта?
Почти понимаете, слово верное — полиморфизм,
а именно тут — завязываетесь на интерфейс родителя, соответственно ЛЮБОЙ РЕБЕНОК будет удовлетворять коду, который работает с интерфейсом родителя
если завяжитесь на интерфейсе ребенка — не подменить другой реализацией Set
одним из эффекта — нарушение принципа подстановки Барбары Лисков (L из SOLID), на который указал Сергей Горностаев