¿Por qué es un ClassCastException solamente produce cuando se accede al valor de retorno?

StackOverflow https://stackoverflow.com/questions/1268623

  •  13-09-2019
  •  | 
  •  

Pregunta

En relación con esta cuestión,

Teniendo en cuenta esta función:

public static <S extends CharSequence> S foo(S s) {
  return (S) new StringBuilder(s);
}

¿Por qué ejecutar esta invocación sin excepción:

foo("hello");

Pero éste lanza ClassCastException?

System.out.println(foo("hello"));
¿Fue útil?

Solución

Los genéricos en Java son 5/6 tipo borrado , lo que significa que cualquier tipo genérico es fundamentalmente sólo un tipo Object (o cualquiera que sea el tipo menos común denominador es, que es en este caso CharSequence) en tiempo de ejecución. Los moldes apropiados se insertan siempre que sea necesario. Por lo que su método obtiene Type-borrado a algo que se parece a esto:

public static CharSequence foo(CharSequence s) {
  return (CharSequence) new StringBuilder(s);
}

Y su llamada Obtiene el tipo que se ha borrado a esto:

System.out.println((String)foo("hello"));

Al parecer Java no se molestarán en la inserción del elenco (String) si el valor de retorno no se usa nunca, ¿por qué molestarse?

Otros consejos

Los tipos genéricos son sólo está disponible para el compilador, y se erasured (básicamente omitidas) en tiempo de ejecución. Por lo que el elenco se ignora en el método

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top