Warum wirft dieser Code eine Classcast und wie es zu vermeiden
-
19-09-2019 - |
Frage
Betrachten Sie diesen Code ein:
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;
}
}
Lösung
Ihre Klasse implementiert Comparator<jm45>
statt Comparable<jm45>
.
Ein Comparator
weiß, wie zwei Objekte vergleichen - ein Comparable
weiß, wie einen anderen zu vergleichen mit mir selbst
Sie müssen entweder in einem Komparator passieren für sort()
(als zweites Argument) zu verwenden oder die Werte müssen vergleichbar sein.
Hier ist eine Version, die die Comparable
Schnittstelle verwendet statt:
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;
}
}
Und hier ist eine Version, die die Comparator
-Schnittstelle verwendet:
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());
}
}
Es gibt nichts zu Stop eine Klasse Comparator<T>
für sich die Umsetzung, aber es ist ein wenig seltsam für sie, dies zu tun. Zum Beispiel würde man normalerweise nicht eine Saite fragt beide andere miteinander zu vergleichen - es nichts bekommt ist mit der ursprünglichen Zeichenfolge selbst zu tun
Andere Tipps
Von der Collections.sort javadoc:
Sortiert die angegebene Liste in aufsteigender Reihenfolge, nach dem natürliche Reihenfolge seiner Elemente. Alle Elemente in der Liste müssen implementieren die Schnittstelle Comparable . Darüber hinaus können alle Elemente in der Liste muss für beide Seiten vergleichbar (das heißt, e1.compareTo (e2) darf keinen Classcast werfen für jedes Element e1 und e2 in der Liste).
Ihre Klasse implementiert Komparator, nicht vergleichbar.