ClassCastException java.lang.Object cannot be cast to java.lang.Comparable при добавлении Object в TreeMap

474
05 февраля 2017, 11:44

Предположим, что у меня есть TreeMap c типом Object у ключа и значения. Я хочу положить в TreeMap Object:

TreeMap<Object, Object> treeMap = new TreeMap();
treeMap.put(new Object(), new Object());

Данный код выдаст ошибку:

java.lang.ClassCastException: java.lang.Object cannot be cast to java.lang.Comparable

в методе

final int compare(Object k1, Object k2) {
    return comparator==null ? ((Comparable<? super K>)k1).compareTo((K)k2)
        : comparator.compare((K)k1, (K)k2);
}

который находится внутри TreeMap.

Я понимаю, что если вместо Object возьму String, Integer или любой другой тип, то всё будет нормально. Почему не проходит с Оbject-ом?

Answer 1

TreeMap - коллекция, которая реализует внутри себя красно-черное дерево. Для этой структуры обязательно, чтобы ключи можно было сопоставить между собой(больше, меньше и эквивалентно). Поэтому для того чтобы положить какой-то объект внутрь, необходимо выполнить одно из условий:

  • Ключ должен реализовывать интерфейс Comparable
  • При создании TreeMap передать в конструктор имплементацию интерфейса Comparator, которая сможет сравнить между собой объекты ключа

В вашем же случае класс Object пытаются привести к Comparable, и программа на этом падает, т.к. это невозможно. String, Integer, Double и много еще каких классов из стандартной библиотеки уже реализуют этот интерфейс, и поэтому с ними всё отрабатывает.

READ ALSO
406 not acceptable

406 not acceptable

Получаю ошибку вида 406 not acceptableИспользую spring boot и gradle В контролере

384
Вывод List в виде списка в jsp [требует правки]

Вывод List в виде списка в jsp [требует правки]

Метод, который занимается выводом данных работает нормально, но не получается вывести список на jsp

579
Не работает СSS правило

Не работает СSS правило

Не хотят работать первые два правила

596
Подскажите как грамотно сверстать блок

Подскажите как грамотно сверстать блок

Есть блок с услугами и ценами

432