Можливо, ви почули екстраполяцію закону Постеля : "Будьте консервативними в тому, що ви надсилаєте, ліберальним у тому, що ви приймаєте".
Переважно йдеться про максимальне використання коду. Легко придумати випадки, щоб продемонструвати, чому це допомагає. Розглянемо Iterable<T>приклади Java . Якщо єдиним вашим методом є ітерація всіх Ts, наявність типу Iterable<T>вашого параметра дозволяє використовувати цей метод з більш ніж 60 вбудованими класами, не кажучи вже про користувацькі класи, що реалізують інтерфейс. Якщо ви обмежили це, скажімо, Vector<T>тоді будь-який код, який викликає ваш метод, повинен був би перетворити на Vector<T>перший.
З іншого боку, повертаючисьIterable<T> з методу обмежує обсяг коду , який може використовувати ваше повертається значення тим , що приймає Iterable<T>параметр. Якщо ви повертаєте дуже конкретний тип, як Vector<T>, то ваше повернення значення може бути передано в будь-який метод , який приймає Serializable, Cloneable, Iterable<T>, Collection<T>, List<T>, RandomAccess, Vector<T>, AbstractList<T>, або AbstractCollection<T>, і він буде працювати , як очікувалося.