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?
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?
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.
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…
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);
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.
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