Возможно, вы слышали экстраполяцию закона Постеля : «Будь консервативным в том, что ты посылаешь, либеральным в том, что ты принимаешь».
В основном речь идет о максимизации повторного использования кода. Легко придумать случаи, чтобы продемонстрировать, почему это помогает. Рассмотрим Java Iterable<T>в качестве примера. Если единственное, что делает ваш метод, это перебирает все 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>, и он будет работать , как ожидалось.