Почему этот код выдает ClassCastException и как этого избежать
-
19-09-2019 - |
Вопрос
Рассмотрим этот код:
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;
}
}
Решение
Ваш класс реализует Comparator<jm45>
вместо того , чтобы Comparable<jm45>
.
A Comparator
знает , как сравнить два объекта - a Comparable
умеет сравнивать другого с самим собой.
Вам либо нужно передать компаратор для sort()
использовать (в качестве второго аргумента) или значения должны быть сопоставимы.
Вот версия, которая использует Comparable
интерфейс вместо:
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;
}
}
И вот версия, которая использует 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());
}
}
Там нет ничего, чтобы остановка класс , реализующий Comparator<T>
для себя, но это немного странно, что он так поступает.Например, обычно вы не стали бы просить одну строку сравнить две другие друг с другом - это не имеет никакого отношения к самой исходной строке.
Другие советы
Из коллекций.сортировать javaDoc:
Сортирует указанный список в порядке возрастания в соответствии с естественным порядком расположения его элементов. Все элементы в списке должны реализовывать сопоставимый интерфейс.Кроме того, все элементы в списке должны быть взаимно сопоставимые (то есть e1.compareTo(e2) не должен вызывать ClassCastException для любых элементов e1 и e2 в списке).
Ваш класс реализует Comparator, а не Comparable .