Это на самом деле один из самых распространенных и полезных способов использования интерфейса. Интерфейс определяет контракт, и ваш код может работать с любым классом, который реализует интерфейс, без необходимости знать конкретный класс - он может даже работать с классами, которые еще не существовали на момент написания кода.
Существует множество примеров в стандартном API Java, особенно в структуре коллекций. Например, Collections.sort () может сортировать все, что реализует интерфейс List
(не только ArrayList
или LinkedList
, хотя реализация собственного List
редко), а содержимое которого реализует Comparable
интерфейс (не просто String
или числовые классы-обертки - и наличие собственного класса, реализующего для этой цели Comparable
для этой цели вполне распространено).