Класс не может быть приведен к java.lang.Comparable, даже если аналог реализован

Я хочу отсортировать массив, который содержит объекты «Счетчик», с помощью метода Collections.sort(). Я реализовал аналогичный интерфейс в классе Counter. Тем не менее я получаю исключение класса. Я разместил код ниже.

public class Counter implements Comparable<Counter>, java.io.Serializable {

    private String description;

    public Counter() {
    }

    public Counter(String description) {

        this.description = description;

    }

    public int compareTo(Counter other) {
        return description.compareTo(other.description);
    }
}

В приведенном ниже методе я вызываю метод сортировки.

    protected List < Counter > prepareCounters(final Integer authorityID) throws ServiceException {
    if (authorityID == null) {
        return new ArrayList < Counter >();
    }

    List < Counter > countersInRegistry = new ArrayList < Counter >(counterRegistry.getAllCounters());
    List < Counter > countersFromService =
            new ArrayList < Counter >(counterService.searchCounters(authorityID, null, null));
    countersFromService.removeAll(countersInRegistry);
    Collections.sort(countersFromService);
    return countersFromService;
}

person Pathfinder92    schedule 16.10.2013    source источник
comment
Покажите нам код, который выдает исключение.   -  person SLaks    schedule 16.10.2013
comment
И фактическое исключение, которое должно ссылаться на имя файла, имя класса и номер строки, в которой создается исключение.   -  person nhgrif    schedule 16.10.2013
comment
Опубликуйте код, в котором вы выполняете операцию сортировки.   -  person Vaibhav Raj    schedule 16.10.2013
comment
Скорее всего, вы пытаетесь отсортировать список, в котором есть и другие несовместимые объекты. В универсальном методе compareTo() есть неявное приведение, и оно завершится ошибкой, если другой объект не является Counter.   -  person kiheru    schedule 16.10.2013


Ответы (1)


У меня работает (OpenJDK7)>

// Главный ----------------------------------------------- -----

package stackover_basic;

import java.util.Arrays;
import java.util.Collections;
import java.util.List;

public class StackOver_basic {
    public static void main(String[] args) {
        List<Counter> asList = Arrays.asList(new Counter("xx"), new Counter("aa"), new Counter("zz"));
        System.out.println("before" + asList);
        Collections.sort(asList);        
        System.out.println("after" + asList);
   }
}

// Прилавок ----------------------------------------------- --

public class Counter implements Comparable<Counter>, java.io.Serializable {

    private String description;

    public Counter() {
    }

    public Counter(String description) {
        this.description = description;
    }

    @Override
    public int compareTo(Counter other) {
        return description.compareTo(other.description);
    }

    @Override
    public String toString() {
        return "Counter{" + "description=" + description + '}';
    }
}

Выход>

run:
before[Counter{description=xx}, Counter{description=aa}, Counter{description=zz}]
after[Counter{description=aa}, Counter{description=xx}, Counter{description=zz}]

РЕДАКТИРОВАТЬ: Вполне возможно, что classCastExc исходит из вашего определения compareTo. Причина: вы добавляете в коллекцию неправильный объект, т.е. возвращаемые типы методов counterService.searchCounters и counterRegistry.getAllCounters не являются универсальными в классе Counter.

person Sergio    schedule 16.10.2013
comment
Да, в коде, опубликованном ОП до сих пор, нет ничего особенно плохого. Проблема почти наверняка связана с вызывающим кодом, которого мы еще не видели. Этот ответ на самом деле мало что добавляет к обсуждению. - person Ian McLaird; 16.10.2013
comment
Согласно низкому уровню информации, полностью действителен. Он не умеет сортировать, я показываю ему, как это делать. - person Sergio; 16.10.2013
comment
Я отредактировал вопрос, включая метод вызова Collections.sort() . - person Pathfinder92; 17.10.2013
comment
@Pathfinder92 прочитал правку; - person Sergio; 17.10.2013