Sobes.tech
Junior — Middle

¿En qué se diferencian las palabras clave extends y super al usar generics en Java?

sobes.tech AI

Respuesta de la IA

En Java, al trabajar con genéricos, las palabras clave extends y super se utilizan para restringir los tipos y afectan la covarianza y la contravarianza.

  • ? extends T — restricción superior (covarianza). Permite usar el tipo T o cualquier subclase de él. Esto significa que se pueden leer objetos del tipo T de la colección, pero no se pueden agregar objetos de forma segura a dicha colección (excepto null).

  • ? super T — restricción inferior (contravarianza). Permite usar el tipo T o cualquier superclase de él. Esto significa que se pueden agregar objetos del tipo T a la colección, pero al leer solo se pueden obtener objetos del tipo Object o de un tipo más general.

Ejemplo:

List<? extends Number> listExtends = new ArrayList<Integer>();
Number num = listExtends.get(0); // Se puede leer como Number
// listExtends.add(10); // Error de compilación

List<? super Integer> listSuper = new ArrayList<Number>();
listSuper.add(10); // Se puede agregar Integer
Object obj = listSuper.get(0); // Al leer, el tipo es Object

Por lo tanto, extends se usa cuando se necesita leer datos de la estructura, y super cuando se necesita escribir datos.