method - java generics parameter
¿Cuál es la diferencia entre ''super'' y ''extends'' en Java Generics (6)
Esta pregunta ya tiene una respuesta aquí:
- Diferencia entre <? super T> y <? extiende T> en Java 12 respuestas
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 tipoType
. Este es el comodín más útil. -
? super Type
? super Type
: indica una familia de supertipos del tipoType
. -
?
: 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.
Recuerde PECS: el productor amplía el soporte al consumidor. Además, el tío Bob lo analiza bien en su serie de artesanos. Consulte http://objectmentor.com/resources/articles/The_Craftsman_44__Brown_Bag_I.pdf
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;)