Sto cercando di imparare i generici di Java. Non sono chiaro quando userete e quando userete
. Cosa significano ognuna di queste cose su T? Diciamo che ho
e
, che cosa significano ciascuno di questi?
Ho letto diversi tutorial su sun.com ma sono ancora perso. Qualcuno può illustrare con esempi?
Grazie!
Vedi efficace Seconda edizione Java, elemento 28:
PECS
P roducer e xtends, C onsumer s uper
Se il tuo parametro è un produttore, dovrebbe essere extends T>
extends T>
, se è un consumatore deve essere super T>
super T>
.
Dai un’occhiata alle Google Collections, sanno come usarle, perché hanno Bloch;)
Dipende da che parte della gerarchia ereditaria consente. Supponiamo di avere una class “Child” che eredita da “Parent” che eredita da “Nonni”.
accetta Parent o Child mentre
accetta Parent o Nonni.
Esistono tre tipi di caratteri jolly:
? extends Type
? extends Type
: indica una famiglia di sottotipi di tipo Type
. Questo è il carattere jolly più utile. ? super Type
? super Type
: indica una famiglia di supertipi di tipo Type
. ?
: Indica l’insieme di tutti i tipi o qualsiasi. Per me la migliore risposta è arrivata da @BSingh, quando ho letto l’articolo di Uncle Bob. Riprendo qui, la conclusione dell’articolo.
Usa Lista
Quando metti un object nella lista, tutto quello che ti interessa è che l’object è di un tipo che è compatibile con il tipo tenuto dall’elenco. Quindi vuoi che la lista prenda il tipo di quell’object o una qualsiasi delle superclassi di quell’object.
Usa Elenco
D’altra parte, quando leggi da una lista, vuoi che il tipo che stai leggendo sia il tipo contenuto dall’elenco o una derivata da quel tipo.
Se stai chiedendo dei parametri di tipo, allora non c’è alcun costrutto
in Java. Il parametro limitato può solo extend
, ma può estendere più di un tipo. Per esempio
public class MyClass< T extends Closeable & Runnable > { // Closeable and Runnable are chosen for demonstration purposes only }
In questo caso, se vedi MyClass< ConcreteT >
ConcreteT deve essere dichiarato come
public class ConcreteT implements Closeable, Runnable { ... }
Per i caratteri jolly limitati, leggi questo articolo . Leggi la sezione sul principio get-put . Fondamentalmente, super
corrisponde a write
semantica, e extends
corrisponde a read
semantica.
Ricorda PECS – Producer Extends Consumer Support. Inoltre, lo zio Bob lo discute bene nella sua serie di artigiani. Dai un’occhiata a http://objectmentor.com/resources/articles/The_Craftsman_44__Brown_Bag_I.pdf