qual è la differenza tra “super” e “estende” in Java Generics

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 , se è un consumatore deve essere .

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 super Suit> ogni volta che scrivi nella 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 estende Suit> ogni volta che vuoi leggere da un 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