Ho questo po 'di osservazioni (contro-intuitive) sulla notazione jolly generica utilizzata nelle raccolte. Il scopo della notazione jolly List<? extends T>
è consentire il assegnazione di un elenco (di sottotipi di T) al riferimento diElenco di "? Of T". Il suo scopo non è quello di consentire specificamente l'aggiunta di elementi di sottotipi di T nell'elenco (di "? Di T"), che è possibile anche in un List<T>
.
List<Number> list = new ArrayList<Integer>(); // invalid , List<Integer> is not assignable to List<Number>
List<Number> list = new ArrayList<Number>() ; // OK
list.add(new Integer(1)); // valid , "? extends Number" not needed!
List<? extends Number> list1 = new ArrayList<Integer>(); // Valid , because of notation "? extends Number"
La mia osservazione è corretta?
risposte:
8 per risposta № 1Sì, la tua osservazione è corretta. Tuttavia, nel caso che mostri, non è molto utile (stai scegliendo di ignorare informazioni utili sull'elenco). L'assegnazione è più utile quando è implicita quando si chiama una funzione di libreria.
Ad esempio, supponiamo che tu abbia una funzione di libreria che chiude una raccolta di InputStreams. Potresti accettare a List<InputStream>
, ma ciò è inutilmente restrittivo. Potresti invece fare questo:
public void closeAll(Collection<? extends InputStream> streams) {
for ( InputStream stream : streams ) {
stream.close();
}
}
Ora puoi passare a List<FileInputStream>
anziché.
1 per risposta № 2
Extends è per la lettura da un elenco e Super è per la scrittura in un elenco. Leggi la pagina 7 di questo tutorial: http://java.sun.com/j2se/1.5/pdf/generics-tutorial.pdf
Leggi queste note di lezione della classe MIT nella costruzione di software: http://stellar.mit.edu/S/course/6/sp11/6.005/courseMaterial/topics/topic2/lectureNotes/Generics-spring11/Generics-spring11.pdf
speriamo che questi chiariscano tutto con caratteri jolly e generici.