useful parameter method example are java generics

method - java generics parameter



¿Cuál es la diferencia entre ''super'' y ''extends'' en Java Generics (6)

Esta pregunta ya tiene una respuesta aquí:

Estoy tratando de aprender genéricos de Java. No estoy seguro de cuándo utilizará <T extends Foo> y cuándo usará <T super Foo> . ¿Qué significa cada una de estas cosas sobre T? Digamos que tengo <T extends Comparable> y <T super Comparable> , ¿qué significa cada uno de estos?

He leído varios tutoriales en sun.com, pero todavía estoy perdido. ¿Alguien puede ilustrar con ejemplos?

¡Gracias!


Depende de qué manera en la jerarquía de herencia que permita. Supongamos que tiene una clase "Niño" que hereda de "Padre" que hereda de "Abuelo".

<T extends Parent> acepta Parent o Child, mientras que <T super Parent> acepta Parent o Grandparent.


Hay tres tipos de comodines:

  • ? extends Type ? extends Type : denota una familia de subtipos de tipo Type . Este es el comodín más útil.
  • ? super Type ? super Type : indica una familia de supertipos del tipo Type .
  • ? : Denota el conjunto de todos los tipos o cualquiera.

Para mí, la mejor respuesta vino de @BSingh, cuando leí el artículo de Uncle Bob. Vuelvo aquí, la conclusión del artículo.

Use List <T super Suit> cada vez que vaya a escribir en la lista.

Cuando coloca un Objeto en la Lista, lo único que le preocupa es que el objeto sea de un tipo compatible con el tipo de la lista. Así que desea que la lista tome el tipo de ese objeto o cualquiera de las superclases de ese objeto.

Use List <T extends Suit> cuando vaya a leer de una lista.

Por otro lado, cuando lee de una lista, quiere que el tipo que está leyendo sea del tipo que figura en la lista, o un derivado de ese tipo.



Si está preguntando acerca de los parámetros de tipo, entonces no existe una construcción <T super X> en Java. El parámetro delimitado solo se puede extend , pero puede extender más de un tipo. P.ej

public class MyClass< T extends Closeable & Runnable > { // Closeable and Runnable are chosen for demonstration purposes only }

En este caso, si ve MyClass< ConcreteT > entonces ConcreteT debe declararse como

public class ConcreteT implements Closeable, Runnable { ... }

Para los comodines delimitados, lea este artículo . Lea la sección sobre el principio get-put . Básicamente, super corresponde a la semántica de write , y extends corresponde a la semántica de read .


Ver Effective Java 2nd Edition, Item 28:

PECS

P roducer e xtends, C onsumer s uper

Si su parámetro es un productor, debería ser <? extends T> <? extends T> , si es un consumidor tiene que ser <? super T> <? super T> .

Eche un vistazo a Google Collections, ellos saben cómo usarlo, porque obtuvieron a Bloch;)