我正在尝试将两个“Employee”对象添加到 TreeSet:
Set<Employee> s = new TreeSet<Employee>();
s.add(new Employee(1001));
s.add(new Employee(1002));
但是它抛出一个 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)
但是如果我只向 TreeSet 添加一个对象:
Set<Employee> s = new TreeSet<Employee>();
s.add(new Employee(1001));
或者如果我改用 HashSet:
Set<Employee> s = new HashSet<Employee>();
s.add(new Employee(1001));
s.add(new Employee(1002));
那么就成功了。为什么会发生异常,我该如何解决?
最佳答案
要么 Employee
必须实现 Comparable
, 或者你需要 provide a comparator创建 TreeSet
时.
这在 SortedSet
的文档中有详细说明:
All elements inserted into a sorted set must implement the
Comparable
interface (or be accepted by the specified comparator). Furthermore, all such elements must be mutually comparable:e1.compareTo(e2)
(orcomparator.compare(e1, e2)
) must not throw aClassCastException
for any elementse1
ande2
in the sorted set. Attempts to violate this restriction will cause the offending method or constructor invocation to throw aClassCastException
.
如果您不满足这些要求,有序集将不知道如何比较其元素,也将无法运行。
关于java - 为什么 TreeSet 抛出 ClassCastException?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15943031/