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