Por que é um ClassCastException única acionada quando o valor de retorno é acessado?

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

  •  13-09-2019
  •  | 
  •  

Pergunta

esta questão

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"));
Foi útil?

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top