Potresti aver sentito un'estrapolazione della legge di Postel : "Sii prudente in ciò che mandi, liberale in ciò che accettare ".
Principalmente si tratta di massimizzare la riusabilità del codice. È facile trovare casi per dimostrare perché aiuta. Prendi in considerazione la Iterable<T>
di Java come esempio. Se l'unica cosa che fa il tuo metodo è iterare attraverso tutti i T
s, avendo un Iterable<T>
come tipo di parametro ti permette di usare quel metodo con oltre 60 classi built-in, per non parlare delle classi personalizzate che implementano l'interfaccia . Se lo hai limitato, ad esempio, a Vector<T>
, qualsiasi codice che chiama il tuo metodo dovrebbe prima convertire in Vector<T>
.
D'altro canto, restituire un Iterable<T>
da un metodo limita la quantità di codice che può utilizzare il valore restituito a quelli che accettano un parametro Iterable<T>
. Se restituisci un tipo molto concreto, come Vector<T>
, allora il tuo valore di ritorno può essere passato in qualsiasi metodo che prende un Serializable
, Cloneable
, Iterable<T>
, Collection<T>
, List<T>
, RandomAccess
, Vector<T>
, AbstractList<T>
o AbstractCollection<T>
, e funzionerà come previsto.