Por que é um ClassCastException única acionada quando o valor de retorno é acessado?
-
13-09-2019 - |
Pergunta
Dada esta função:
public static <S extends CharSequence> S foo(S s) {
return (S) new StringBuilder(s);
}
Por que esta invocação executar sem exceção:
foo("hello");
Mas este lança ClassCastException?
System.out.println(foo("hello"));
Solução
Os genéricos em Java 5/6 são apagados do tipo , o que significa que qualquer tipo genérico é fundamentalmente apenas um tipo Object
(ou qualquer que seja o tipo de mínimo denominador comum é, que é, neste caso, CharSequence
) em tempo de execução. São inseridos os moldes apropriados sempre que necessário. Portanto, o seu método obtém a algo apagado do tipo que se parece com isso:
public static CharSequence foo(CharSequence s) {
return (CharSequence) new StringBuilder(s);
}
E a sua chamada chega a esta apagada-type:
System.out.println((String)foo("hello"));
Aparentemente Java não vai incomodar a inserção do elenco (String)
se o valor de retorno nunca é usado-por que se preocupar?
Outras dicas
tipos genéricos só estão disponíveis para o compilador, e são erasured (basicamente omitido) em tempo de execução. Então, o elenco é ignorado dentro do método