Porque é que este código jogando um ClassCastException e como evitá-la
-
19-09-2019 - |
Pergunta
Considere este código:
import java.util.*;
class jm45 implements Comparator<jm45>
{
private int x;
jm45(int input) { x = input; }
public static void main( String args[] )
{
List list = new ArrayList();
list.add(new jm45(2));
list.add(new jm45(2));
Collections.sort(list); //faulty line
}
public int compare( jm45 t1 , jm45 t2 )
{
return t1.x - t2.x;
}
}
Solução
Seus implementos classe Comparator<jm45>
vez de Comparable<jm45>
.
A Comparator
sabe como comparar dois objetos -. A Comparable
sabe como comparar um outro com a própria
, quer necessidade de passar em um comparador para sort()
para utilização (como o segundo argumento) ou os valores têm de ser comparáveis.
Aqui está uma versão que usa a interface Comparable
vez:
import java.util.*;
class Test implements Comparable<Test>
{
private int x;
Test(int input)
{
x = input;
}
public static void main(String args[])
{
List<Test> list = new ArrayList<Test>();
list.add(new Test(2));
list.add(new Test(2));
Collections.sort(list);
}
public int compareTo(Test other)
{
return x - other.x;
}
}
E aqui está uma versão que usa a interface Comparator
:
import java.util.*;
class TestComparator implements Comparator<Test>
{
public int compare(Test t1, Test t2)
{
return t1.getX() - t2.getX();
}
}
class Test
{
private int x;
Test(int input)
{
x = input;
}
int getX()
{
return x;
}
public static void main(String args[])
{
List<Test> list = new ArrayList<Test>();
list.add(new Test(2));
list.add(new Test(2));
Collections.sort(list, new TestComparator());
}
}
Não há nada a Parar a classe implementando Comparator<T>
por si mesmo, mas é um pouco estranho para ele a fazê-lo. Por exemplo, você normalmente não pedir uma corda para comparar duas outras uns com os outros - não tem nada a ver com a string original em si tem
Outras dicas
A partir do Javadoc Collections.sort:
Classifica a lista especificada em ordem crescente, de acordo com o ordenação natural de seus elementos. Todos os elementos na lista de must implementar a interface Comparable . Além disso, todos os elementos na lista deve ser mutuamente comparável (isto é, e1.compareTo (e2) não deve jogar uma ClassCastException para qualquer elemento E1 e E2 na lista).
Seus implementos classe Comparator, não é comparável.