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 Ts, 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.