¿Cuál es la diferencia entre <? super T> y <? extends T> en los genéricos de Java?
¡Saludos, colegas! Empecé a estudiar los genéricos de Java y me encontré con los wildcards (comodines). Leí la documentación y vi videos, pero todavía me confundo con dos construcciones: ` super T>` y ` extends T>`.
Entiendo que `? extends T` significa "algún tipo que es subtipo de T", y `? super T` significa "algún tipo que es supertipo de T". Pero en la práctica, constantemente tengo errores de compilación.
Por ejemplo, tengo este código con List:
```java
public class Test {
public static void addNumbers(List super Integer> list) {
list.add(42); // Esto funciona
}
public static void readNumbers(List extends Integer> list) {
Integer num = list.get(0); // Esto funciona
list.add(42); // ¡Error de compilación! ¿Por qué?
}
}
```
¿Por qué no puedo agregar un elemento a `List extends Integer>`, aunque puedo leer de él? Y viceversa: ¿por qué puedo agregar a `List super Integer>`, pero al leer de allí obtengo solo Object?