当前位置: 首页 > 面试题库 >

为什么TreeSet抛出ClassCastException?

有睿
2023-03-14
问题内容

我试图将两个’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,或者你需要提供一个比较创建时TreeSet

在文档中对此进行了详细说明SortedSet

插入排序集中的所有元素都必须实现Comparable接口(或被指定的比较器接受)。此外,所有此类元素都必须相互可比较:(e1.compareTo(e2)comparator.compare(e1, e2))不得ClassCastException对任何元素e1以及e2已排序的集合抛出a
。尝试违反此限制将导致违规方法或构造函数调用抛出ClassCastException

如果您不满足这些要求,则排序后的集合将不知道如何比较其元素,并且将无法运行。



 类似资料:
  • 我试图将两个“Employee”对象添加到树集中: 但它引发了一个ClassCastException: 但是如果我只向TreeSet添加一个对象: 或者如果我使用哈希集: 那么它就是成功的。为什么会发生异常,如何修复它?

  • 问题内容: final Multimap terms = getTerms(bq); for (Term t : terms.keySet()) { Collection C = new HashSet(terms.get(t)); if (!C.isEmpty()) { for (Iterator it = C.iterator(); it.hasNext();) { BooleanClause

  • 问题内容: 将字符串解析为字节时出现异常 问题答案: 这是因为默认的parse方法要求使用十进制格式的数字来解析十六进制数字,请使用以下parse: 其中16是解析的基础。 至于您的评论,您是对的。字节的最大值为0x7F。因此,您可以将其解析为并执行二进制与操作以获得LSB,即您的字节:

  • 问题内容: 我有这种方法: 映射: Person.hbm.xml Cars.hbm.xml 此方法适用于单个线程,并且在多个线程上,给我一个错误: AOP交易: 注意:当我在更新后添加Thread.sleep(5000)时,就可以了。 但是这种解决方案并不干净。 问题答案: 我有汽车->(1-n)个地方。而且我在表位置(id_car)有一个外键。此外键没有索引。当我向该外键添加索引时,我的问题已解

  • 当使用Mockito截尾时,我们通常为一个方法指定一个具体的参数。之后,我们可以用相同的参数调用Stubed方法。例如,在下面的代码中,get()用参数0进行了stubed。所以,当调用get()时,get()的参数也是0。因此,get()将返回一个整数,即3。 如果调用语句被修改为: 即参数更改为1,然后Mockito抛出“NullPointerException”,而不是“AssertionE

  • 下面是我的代码: 现在我的脑海中应该不会出现不匹配,因为显然提取了两个整数?!