Зачем ссылку на объект с реализацией интерфейса помещать в переменную типа этого интерфейса?
Здравствуйте!
Для решения одной задачи мне показали некоторый код, в котором использовались коллекции. Начал читать про них, общую картину сформировал, но некоторые моменты остались неясными. final Set<KeyCode> codes = new HashSet<>();
Класс HashSet - это ведь реализация интерфейса Set, т.е. он содержит в себе реализации методов, которые содержатся в интерфейсе Set. (я это правильно понимаю?)
Почему мы создаем переменную типа интерфейса, чтобы она ссылалась на объект, класс которого реализует этот самый интерфейс?
Почему мы не можем и не должны написать просто final HashSet<KeyCode> codes = new HashSet<>();
Уже много чего прочитал про коллекции, посмотрел видео-уроки, но все равно все как в тумане.
Для того, чтобы передавать не конкретный класс, а интерфейс. Тогда мы не будем зависеть от конкретной реализации интерфейса. В принципе, если внутри метода мы используем только реализацию класса, то интерфейс можно и не тянуть.
лл, сложна
ну, мы создали объект HashSet, в нем реализованы методы Set
потом отправили ссылку на этот объект в переменную типа Set, у нас как-то изменилась реализация методов объекта HashSet?
можно по проще?)
Есть куча реализаций интерфейса Set, вам же не важно, какая именно реализация будет? Теперь мы делаем 200 методов, в параметры которого передали Set. Им тоже не важна внутренняя реализация. А теперь, мы плюнули на интерфейс, и вместо Set, прописали конретный класс HashSet в эти 200 методов. Через пол года стали использовать другую реализацию - RemoteSet, и код перестал компилироваться, нужно поменять все 200 методов, а не одно место!