Być może słyszałeś ekstrapolację prawa Postela : „Bądź konserwatywny w tym, co wysyłasz, liberalny w tym, co akceptujesz”.
Głównie chodzi o maksymalizację możliwości ponownego wykorzystania kodu. Łatwo jest wymyślić przypadki, aby pokazać, dlaczego to pomaga. Rozważ Java Iterable<T>jako przykład. Jeśli jedyną rzeczą, którą robi twoja metoda, jest iteracja przez wszystkie Ts, posiadanie Iterable<T>jako typu parametru pozwala na użycie tej metody z ponad 60 wbudowanymi klasami, nie wspominając o żadnych niestandardowych klasach implementujących interfejs. Jeśli ograniczysz go do, powiedzmy, Vector<T>kodu, który wywołuje twoją metodę, będzie musiał zostać przekonwertowany na Vector<T>pierwszy.
Z drugiej strony, wracającIterable<T> z metody ogranicza ilość kodu, który może wykorzystać swoją wartość powrotną do tych, które biorą Iterable<T>parametr. Jeśli wrócisz typ bardzo konkretny, jak Vector<T>, wówczas wartość powrotu może być przekazywana w dowolnej metody, która trwa Serializable, Cloneable, Iterable<T>, Collection<T>, List<T>, RandomAccess, Vector<T>, AbstractList<T>, lub AbstractCollection<T>, i to będzie działać zgodnie z oczekiwaniami.