Pourquoi est-ce code lancer une ClassCastException et comment l'éviter
-
19-09-2019 - |
Question
Considérez ce code:
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;
}
}
La solution
Votre classe implémente Comparator<jm45>
au lieu de Comparable<jm45>
.
Comparator
sait comment comparer deux objets - un Comparable
sait comment comparer un autre avec lui-même
Vous avez besoin soit de passer dans un comparateur pour sort()
à utiliser (comme second argument) ou les valeurs doivent être comparables.
Voici une version qui utilise l'interface Comparable
place:
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;
}
}
Et voici une version qui utilise l'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());
}
}
Il n'y a rien à arrêt une classe implémentant Comparator<T>
pour lui-même, mais il est un peu étrange pour elle de le faire. Par exemple, vous ne demanderiez pas normalement une chaîne à comparer deux autres les uns avec les autres - il n'a rien à voir avec la chaîne d'origine lui-même
Autres conseils
De la javadoc Collections.sort:
trie la liste spécifiée dans l'ordre croissant, en fonction de la ordre naturel de ses éléments. Tous les éléments de la liste doivent implémenter l'interface Comparable . En outre, tous les éléments dans la liste doit être mutuellement comparables (qui est, e1.compareTo (e2) ne doit pas jeter un ClassCastException pour tous les éléments e1 et e2 dans la liste).
Votre classe implémente Comparator, pas comparables.