Java Comparator

Galera estou perdido. Tenho uma classe do Tipo Generica nesse código abaixo ela funciona para tipos como string , integer etc… Mas se eu passar uma classe do tipo seila " Aluno " ela da error de ClassCastException, Creio eu que o único modo de acertar isso vai ser criando um parametro do tipo compare mas não sei como fazer isso. Alguém me da um help.

Esse é o código de como está atualmente.

`public void boobleSort(){//OK

    for (int i = 0; i < this.contElementos; i++) {//ok
        //boolean ok = false;
        for (int j = 0; j < this.contElementos - 1; j++) {
            if (((Comparable<T>) this.elementos[j]).compareTo(this.elementos[j+1]) > 0 ) {
                T aux = this.elementos[j];
                this.elementos[j] = this.elementos[j+1];
                this.elementos[j+1] = aux;
                
                //ok = true;
            }
        }
        
        //if (!ok) {
        //    return;
        //}
    }
}`

Queria fazer algo como esse código que utilizo em outra classe

Collections.sort(list , new Comparator<Anotacoes>(){ DateFormat f = new SimpleDateFormat("dd/MM/yyyy"); @Override public int compare(Anotacoes o1 , Anotacoes o2){ try{ return f.parse(o1.getData()).compareTo(f.parse(o2.getData())); }catch(ParseException ex){ throw new IllegalArgumentException(); } } });

“Mas se eu passar uma classe do tipo seila " Aluno " ela da error de ClassCastException”

Dê uma olhada na doc das classes String e Integer, em All Implemented Interfaces: você irá ver que ambas implementam a interface Comparable. Quem assina o contrato desta interface tem que implementar o método compareTo e em troca passa a ser também do tipo desta interface ou seja Aluno será um Comparable somente se ele declarar que implementa a interface.

No if dentro do for você está forçando o cast, basicamente dizendo ao compilador “Todo os elementos dentro desta collection são Comparable por isso invoque o compareTo” só que em tempo de execução caso pelo menos um dos elementos não seja um Comparable então haverá ClassCastException.

“Então é só declarar Aluno como Comparable, implementar o método e ta tudo certo?!”

Não, ainda haverá ClassCastException pois a interface foi declarada com Generics justamente pra evitar que se tente comparar classes que nada tem a ver uma com a outra.

“Ok, vlw pela explicação e tal mas como eu concerto o meu código?”

for (int i = 0; i < this.contElementos; i++) {//ok
//boolean ok = false;
	for (int j = 0; j < this.contElementos - 1; j++) {
		
	  //Testamos primeiro para saber se é um Comparable
	 //Mas ser um Comparable não quer dizer q possa ser comparado com o próximo elemento
	//Logo testamos pra saber se o elemento atual é do mesmo tipo do elemento a frente
	if (this.elementos[j] instanceof Comparable && this.elementos[j] instanceof this.elementos[j+1]) {
		
              if ((Comparable<T> this.elementos[j]).compareTo(this.elementos[j+1]) > 0 ) {
		    T aux = this.elementos[j];
		    this.elementos[j] = this.elementos[j+1];
		    this.elementos[j+1] = aux;

		    //ok = true;
  	  }

	}		
}
1 curtida

Muito Obrigado mesmo leofariasrj25, tinha esquecido desse detalhe de implementar a Comparable na classe ’ Aluno ’ você tirou 100% da minha dúvida.