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 T
s, 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.