Pode ser que você tenha ouvido uma extrapolação da lei de Postel : "Seja conservador no que envia, liberal no que aceita".
Principalmente, trata-se de maximizar a reutilização do código. É fácil criar casos para demonstrar por que ajuda. Considere o Java Iterable<T>
como um exemplo. Se a única coisa que seu método faz é iterar todos os T
s, ter um Iterable<T>
tipo de parâmetro permite que você use esse método com mais de 60 classes internas, sem mencionar as classes personalizadas que implementam a interface. Se você o limitou, digamos, a Vector<T>
qualquer código que chame seu método, ele deverá ser convertido em um Vector<T>
primeiro.
Por outro lado, retornar um Iterable<T>
de um método limita a quantidade de código que pode usar seu valor de retorno àqueles que usam um Iterable<T>
parâmetro. Se você retornar um tipo muito concreto, como Vector<T>
, então o seu valor de retorno pode ser transmitida em qualquer método que leva um Serializable
, Cloneable
, Iterable<T>
, Collection<T>
, List<T>
, RandomAccess
, Vector<T>
, AbstractList<T>
, ou AbstractCollection<T>
, e irá funcionar como esperado.