Porque isso nao da ClassCastException?

5 respostas
D
Por que nao da ClassCastException?
List<Pai> listPai = new ArrayList<Pai>();
		
		List<?> l = listPai;
		
		List<String> listString = (List<String>) l;

Uma lista de Strings nao e uma lista de Pais nao era pra dar exceçao?

5 Respostas

J

Você executou esse código?

Provavelmente ele irá dar erro de execução. Toda vez que você faz uma conversão o compilador acredita que irá funcionar.

Se não funcionar, dá erro de execução.

D

javablue:
Você executou esse código?

Provavelmente ele irá dar erro de execução. Toda vez que você faz uma conversão o compilador acredita que irá funcionar.

Se não funcionar, dá erro de execução.

Nao tem nada haver isso de o compilador achar que vai compilar, se vc tentar fazer um casting de algo fora de qualquer tipo de hierarquia da erro de compilação este casso por exemplo:

String teste = (String) new Pai();

O negocio aqui é pq com objetos sem ser coleções igual aqui, da ClassCastException o que ja era esperado.

Object o = new Pai() String = (String) o;

Agora com coleções igual passei a cima nao da ClassCast…

gomesrod

Dota:

O negocio aqui é pq com objetos sem ser coleções igual aqui, da ClassCastException o que ja era esperado.

Object o = new Pai() String = (String) o;
Agora com coleções igual passei a cima nao da ClassCast…

Pelos seus testes o código acima compila mas dá ClassCastException na hora da execução, correto? Imagino que você tenha compreendido bem o motivo, então vejamos o que acontece na lista.

List<Pai> listPai = new ArrayList<Pai>(); List<?> l = listPai; List<String> listString = (List<String>) l;

No momento de compilação vale o mesmo princípio: Ao fazer o casting de você está prometendo ao compilador que a Lista de "um tipo de objeto qualquer" <?> na verdade é uma List<String>. Beleza, ele confia em você e o programa compila.

Agora porque a diferença no momento de executar?

É muito simples: GENERICS NÃO EXISTEM EM TEMPO DE EXECUÇÃO!
Ele é usado para fazer algumas validações em tempo de compilação, mas são removidos do programa compilado, que fica assim:

List listPai = new ArrayList(); List l = listPai; List listString = l;

Por aí dá pra ver que não há motivo para dar erro. Por outro lado, experimente o seguinte e terá um ClassCastException:

List<Pai> listPai = new ArrayList<Pai>(); listPai.add(new Pai()); List<?> l = listPai; List<String> listString = (List<String>) l; String s = listString.get(0);

D

gomesrod:
Dota:

O negocio aqui é pq com objetos sem ser coleções igual aqui, da ClassCastException o que ja era esperado.

Object o = new Pai() String = (String) o;
Agora com coleções igual passei a cima nao da ClassCast…

Pelos seus testes o código acima compila mas dá ClassCastException na hora da execução, correto? Imagino que você tenha compreendido bem o motivo, então vejamos o que acontece na lista.

List<Pai> listPai = new ArrayList<Pai>(); List<?> l = listPai; List<String> listString = (List<String>) l;

No momento de compilação vale o mesmo princípio: Ao fazer o casting de você está prometendo ao compilador que a Lista de "um tipo de objeto qualquer" <?> na verdade é uma List<String>. Beleza, ele confia em você e o programa compila.

Agora porque a diferença no momento de executar?

É muito simples: GENERICS NÃO EXISTEM EM TEMPO DE EXECUÇÃO!
Ele é usado para fazer algumas validações em tempo de compilação, mas são removidos do programa compilado, que fica assim:

List listPai = new ArrayList(); List l = listPai; List listString = l;

Por aí dá pra ver que não há motivo para dar erro. Por outro lado, experimente o seguinte e terá um ClassCastException:

List<Pai> listPai = new ArrayList<Pai>(); listPai.add(new Pai()); List<?> l = listPai; List<String> listString = (List<String>) l; String s = listString.get(0);

Agora esclareceu brother.

T

amigo posso ta falando besteira, mas <?> nao significa que seja object, essim q vai ser de algum tipo no caso quando vc fez o casting para string vc so disse q akela lista eh de string

Criado 27 de abril de 2011
Ultima resposta 27 de abr. de 2011
Respostas 5
Participantes 4