Para mayor claridad, permítanme volver a escribir un poco los ejemplos ...
yo diría, la diferencia entre cruxial:
void a(Object o) {
Integer i = (Integer) o;
...
}
y
void a(Object o) {
List<Integer> list = (List<Integer>) o;
...
}
es que, dado que hay un error de tipo, el primer elenco siempre arroja inmediatamente una RuntimeException (específicamente, una ClassCastException) cuando se ejecuta.
mientras que el segundo podría no - siempre y cuando el parámetro de entrada o algún tipo de List<?>
, la ejecución se acaba de proceder, a pesar de un lanzamiento incorrecto.
Si el código en algún lugar más tarde lanza una excepción o no, depende de lo que haga con la lista.
Pero independientemente, una excepción podría no arrojarse a la línea donde se hizo el elenco, pero en otro lugar (que podría ser un error difícil de rastrear) o en absoluto.
Eso es lo que entiendo, es la razón por la que los compiladores y diseñadores consideraron una advertencia apropiada solo en el segundo caso.
La segunda línea produce una advertencia porque solo los genéricos generan dicha advertencia. El primero no contiene ningún genérico, por lo tanto, no hay advertencia. –