Почему 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