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.