Tengo un par de preguntas sobre comodines genéricos en Java:
¿Cuál es la diferencia entre
List<? extends T>
yList<? super T>
?¿Qué es un comodín acotado y qué es un comodín ilimitado?
java
generics
bounded-wildcard
Pablo fernandez
fuente
fuente
Respuestas:
En su primera pregunta,
<? extends T>
y<? super T>
son ejemplos de comodines acotados. Un comodín ilimitado se parece<?>
y básicamente significa<? extends Object>
. En términos generales, significa que el genérico puede ser de cualquier tipo. Un comodín acotado (<? extends T>
o<? super T>
) impone una restricción al tipo al decir que tiene que extender un tipo específico (<? extends T>
se conoce como límite superior) o tiene que ser un ancestro de un tipo específico (<? super T>
se conoce como límite inferior) .Los tutoriales de Java tienen explicaciones bastante buenas de los genéricos en los artículos comodines y más diversión con comodines .
fuente
<? super C>
significaría que su tipo está restringido a algo arribaC
en la jerarquía de tipos. (Perdón por la respuesta extremadamente tardía. Supongo que no tuvimos notificaciones de comentarios hace 2 años)Si tiene una jerarquía de clases A, B es una subclase de A, y C y D son subclase de B como a continuación
Luego
Un comodín acotado es como
? extends B
donde B es algún tipo. Es decir, el tipo es desconocido pero se le puede colocar un "límite". En este caso, está limitado por alguna clase, que es una subclase de B.fuente
List<? super B>
describe como List acepta el tipo que es la clase principal de la clase B ? ¿Por qué C y D no compilan hmm?Josh Bloch también tiene una buena explicación de cuándo usar
super
yextends
en esta charla en video de google io donde menciona el mnemónico Producerextends
Consumersuper
.De las diapositivas de la presentación:
fuente
Puede haber ocasiones en las que desee restringir los tipos de tipos que se pueden pasar a un parámetro de tipo. Por ejemplo, es posible que un método que opera con números solo desee aceptar instancias de Number o sus subclases. Para esto son los parámetros de tipo acotado.
significa que puede aceptar todos los objetos que tienen una relación IS- A con MyObject (es decir, cualquier objeto que sea un tipo de myObject o podemos decir cualquier objeto de cualquier subclase de MyObject) o un objeto de la clase MyObject.
Por ejemplo:
Luego,
aceptará solo MyObject o hijos de MyObject (es decir, cualquier objeto de tipo OurObject o YourObject o MyObject, pero no ningún objeto de la superclase de MyObject).
fuente
En general,
Para poner elementos en la estructura, necesitamos otro tipo de comodín llamado
Wildcards with super
,fuente
Los comodines genéricos se crean para hacer que los métodos que operan en Collection sean más reutilizables.
Por ejemplo, si un método tiene un parámetro
List<A>
, solo podemos darleList<A>
a este método. Es un desperdicio para la función de este método en algunas circunstancias:List<A>
, entonces se nos debería permitir darList<A-sub>
a este método. (Porque A-sub ES una A)List<A>
, entonces se nos debería permitir cederList<A-super>
a este método. (Porque A ES un A-super)fuente