Почему этот код выдает ClassCastException и как этого избежать

StackOverflow https://stackoverflow.com/questions/1173789

  •  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 .

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top