collections-java-api-2023 icon indicating copy to clipboard operation
collections-java-api-2023 copied to clipboard

Impressão x Casting ( resolvido )

Open bartomsilva opened this issue 2 years ago • 2 comments

Olá teacher Cami, sou iniciante em Java e estou adorando suas aulas, mas tenho uma questão com relação a este ponto. // Iterando sobre a lista sem Generics (necessário fazer cast) for (Object elemento : listaSemGenerics) { String str = (String) elemento; System.out.println(str); } observei que não preciso de fato de um casting para poder imprimir os valores da lista, e que a forma de casting empregada gera uma Exception, buscando na documentação a forma de fazer o casting então ficaria assim. String str = elemento.toString(); mas gostaria saber sua explicação, se fiz algo de errado que tenha vindo a causar erro ao testar, e qual seria a melhor forma de se fazer esse casting.

bartomsilva avatar Sep 06 '23 10:09 bartomsilva

Oi, @bartomsilva. Tudo bem? Parabéns pelos estudos! Muito pertinente sua dúvida.

Vamos lá:

  • O casting (conversão de tipo) é usado para garantir que todos os elementos em uma lista (ou outra estrutura de dados) sejam do tipo desejado.
  • No nosso caso, queremos que todos os elementos da lista sejam do tipo String, e é por isso que nós estamos fazendo o casting para String durante a iteração.
// Iterando sobre a lista sem Generics (necessário fazer cast)
for (Object elemento : listaSemGenerics) {
    String str = (String) elemento;
    System.out.println(str);
}
  • O "problema" é que a lista não tem um tipo específico definido (sem Generics), o que significa que ela pode conter qualquer tipo de objeto, incluindo Integer, como no nosso exemplo.
  • Nesse cenário, não garantimos que todos os elementos sejam do tipo String, e é por isso que o casting gera uma exceção ClassCastException quando um elemento que não é uma String é encontrado na lista.
// Exemplo sem Generics
List listaSemGenerics = new ArrayList();
listaSemGenerics.add("Elemento 1"); //Aqui está correto. Queremos uma List de String
listaSemGenerics.add(10); // Mas a List sem Generics permite adicionar qualquer tipo de objeto, que neste caso é um Integer.
  • Caso você não queira utilizar o Generics e queira resolver essa exceptions, poderiamos tratar:
for (Object elemento : listaSemGenerics) {
    try {
        String str = (String) elemento;
        System.out.println(str);
    } catch (ClassCastException e) {
        System.out.println("Elemento não é uma String: " + elemento);
    }
  • Mas o Generics em Java permite que você defina o tipo de elementos que uma lista pode conter, aí sim, garantimos a segurança de tipo em tempo de compilação e eliminamos a necessidade de fazer casting manualmente durante a iteração.

Deu para clarear o entendimento?

cami-la avatar Sep 10 '23 09:09 cami-la

Muito obrigado teacher Cami

bartomsilva avatar Sep 11 '23 01:09 bartomsilva