Почему TreeSet бросает ClassCastException

В приведенном ниже коде я пытаюсь добавить два объекта employee

Set<Employee> s = new TreeSet<Employee>();
s.add(new Employee(1001));
s.add(new Employee(1002));

но результат java.lang.ClassCastException:

Exception in thread "main" java.lang.ClassCastException: Employee cannot be cast to java.lang.Comparable
    at java.util.TreeMap.put(TreeMap.java:542)
    at java.util.TreeSet.add(TreeSet.java:238)
    at MyClient.main(MyClient.java:9)

но если я переоденусь.

Set<Employee> s = new TreeSet<Employee>();
s.add(new Employee(1001));

или

Set<Employee> s = new HashSet<Employee>();
s.add(new Employee(1001));
s.add(new Employee(1002));

тогда результат-успех, нет исключения. Я не делаю никакой активности кастинга класса в приведенном выше коде. Пожалуйста, помогите мне выяснить причину и предложить мне решение.

6 ответов


или Employee для реализации Comparable, или вам нужно обеспечивает компаратор при создании TreeSet.

это прописано в документации к SortedSet:

все элементы, вставленные в сортированный набор, должны реализовать Comparable интерфейс (или быть принятым указанным компаратором). Кроме того, все такие элементы должны быть взаимно сопоставимы: e1.compareTo(e2) (или comparator.compare(e1, e2)) не должен бросить ClassCastException для любых элементов e1 и e2 в отсортированном наборе. Попытки нарушить это ограничение приведут к тому, что вызываемый метод или конструктор вызовет ClassCastException.

если вы не выполняете эти требования, сортированный набор не будет знать, как сравнивать его элементы и не сможет функционировать.


поэтому реализуйте сопоставимый интерфейс с объектом Employee по мере необходимости при использовании TreeSet, потому что TreeSet хочет сохранить элементы отсортированными.


TreeSet требуется для элементов для реализации Comparable если Comparator не установлено. HashSet вместо этого использует контракт equals/hashCode.

можно добавить только один элемент TreeSet, который не реализует Comparable потому что его не нужно сравнивать с другими элементами.

посмотри TreeMap.put(K key, V value) исходные коды, и вы четко увидите причины всех ваших вопросов (TreeSet на основе TreeMap, следовательно, ссылки на источник).


С TreeSet#add (E) JavaDoc:

закидываем: ClassCastException - если указанный объект не может быть по сравнению с элементами в данный момент в этом наборе

в основном, что вам нужно, это позволить Employee реализовать Comparable или предоставить Comparator до


TreeSet реализация SortedSet. Вы можете либо позволить Employee реализовать Comparable интерфейс или обеспечить соответствующий Comparator для TreeSet:

Set<Employee> s = new TreeSet<Employee>(new EmployeeComparator());

//class Employee
    public class Employee implements Comparable<Employee>{
    int id;

    Employee(int id){
    this.id=id;
    }

    public int compareTo(Employee e){ //implementing abstract method.
    if(id>e.id){
    return 1;
    }
    return 0;
    }


//class TreeSet

    Set<Employee> emp =new TreeSet<Employee>();

    Employee eobj1 = new Employee(2);
    Employee eobj2 = new Employee(3);
    emp.add(eobj1);
    emp.add(eobj2);

    for (Student ss:emp) {
    System.out.println(ss.rollno);
    }
}
//output: 2
//        3