Solucionado (ver solução)
Solucionado
(ver solução)
3
respostas

Erro: ClassCastException, por quê?

package br.com.alura;

import java.util.Iterator;
import java.util.Set;
import java.util.TreeSet;


public class Teste {

    public static void main(String[] args) {

        Funcionario f1 = new Funcionario("a", 29);
        Funcionario f2 = new Funcionario("b", 31);
        Funcionario f3 = new Funcionario("c", 30);

        Set<Funcionario> funcionarios = new TreeSet<>();

        funcionarios.add(f1);
        funcionarios.add(f2);
        funcionarios.add(f3);
        funcionarios.add(new Funcionario("d", 28));

        Iterator<Funcionario> iterador = funcionarios.iterator();

        while(iterador.hasNext()) {
            System.out.println(iterador.next().getNome());
        }


    }

}
3 respostas

Ok! Descobrir que o problema no meu código foi o fato de eu não ter colocado o

Set<Funcionario> funcionarios = new TreeSet<>(**new OrdenaPorIdade()**);

Eu tentei fazer o exercício antes de ver a resposta. Agora, se possível, gostaria que me explicassem o porquê de colocar o new OrdenaPorIdade()); dentro do método(isso é método né?) do TreeSet. Como que funciona isso pela perspectiva do programa? Como ele lê essa estrutura?

Outra dúvida seria o do

Iterator<Funcionario> iterador = funcionario.iterator();

Eu entendo, que estamos criando um Set, dentro da classe Funcionário, que terá como variável o iterador, que por sua vez está recebendo funcionario que é um TreeSet. Mas por que tenho que colocar funcionario.iterator();? Por que só funcionário não resolveria?

solução!

Opa! Bom dia, Lucas. Tudo certo?

O problema em questão está acontecendo pois o seu TreeSet não está recebendo por parâmetro uma classe Comparator. Como no exemplo mostrado pelo professor, a instância de seu Set de Funcionarios deveria ser assim:

// ... código omitido
Set<Funcionario> funcionarios = new TreeSet<>(new OrdenaPorIdade());
// ... código omitido

... ao contrário de:

// ... código omitido
Set<Funcionario> funcionarios = new TreeSet<>();
// ... código omitido

Se você fizer esta pequena alteração, seu código já deve funcionar. O motivo do seu erro é porque o TreeSet é uma implementação de Set, que ordena automaticamente os valores nele adicionados. Entretanto, para o TreeSet fazer a ordenação, ele precisa compreender como que essa ordenação deve ser feita, e é aí que entra o seu Comparator.

DOCUMENTAÇÃO DO JAVA: Constrói um novo conjunto de árvore vazio, classificado de acordo com o comparador especificado. Todos os elementos inseridos no conjunto devem ser mutuamente comparáveis pelo comparador especificado: comparator.compare(e1, e2) não deve lançar uma ClassCastException para nenhum elemento e1 e e2 no conjunto. Se o usuário tentar adicionar um elemento ao conjunto que viole essa restrição, a chamada add lançará uma ClassCastException.

Vlw Luciano, entendi perfeitamente.