Предположим, что у меня есть 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-ом?
TreeMap - коллекция, которая реализует внутри себя красно-черное дерево. Для этой структуры обязательно, чтобы ключи можно было сопоставить между собой(больше, меньше и эквивалентно). Поэтому для того чтобы положить какой-то объект внутрь, необходимо выполнить одно из условий:
В вашем же случае класс Object пытаются привести к Comparable, и программа на этом падает, т.к. это невозможно. String, Integer, Double и много еще каких классов из стандартной библиотеки уже реализуют этот интерфейс, и поэтому с ними всё отрабатывает.
Сборка персонального компьютера от Artline: умный выбор для современных пользователей