¿Qué es raw type en Java Generics y por qué deberías evitarlo?
¡Hola a todos! Soy un desarrollador Java principiante, estoy estudiando genéricos y me topé con un concepto extraño llamado "raw type" (tipo crudo). Parece que entiendo que está relacionado con las generalizaciones, pero no termino de captar la esencia.
Supongamos que tengo este código:
```java
List list = new ArrayList(); // ¿esto es raw type?
list.add("cadena");
list.add(123);
```
El compilador muestra una advertencia, pero el código funciona. Puedo poner cualquier cosa en la lista. Pero si uso un tipo parametrizado:
```java
List list2 = new ArrayList<>();
list2.add("cadena");
// list2.add(123); // error de compilación
```
Entonces el compilador se queja. ¿Cuál es la diferencia? ¿Por qué raw type se considera una mala práctica? Después de todo, el código funciona con él. He oído que los raw types existen para compatibilidad hacia atrás, pero ¿por qué usarlos en código nuevo? ¿Y cómo se relacionan con el borrado de tipos (type erasure)?
Por favor, den ejemplos de cuándo el uso de raw type puede provocar errores en tiempo de ejecución que no se detectan en tiempo de compilación.