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

列表到TreeSet的转换产生:“java.lang.ClassCastException:MyClass无法转换为java.lang.Comparable”

阳光辉
2023-03-14
问题内容

List myclassList = (List ) rs.get();

TreeSet<MyClass> myclassSet = new TreeSet<MyClass>(myclassList);

我不明白为什么这段代码会产生这个:

java.lang.ClassCastException: MyClass cannot be cast to java.lang.Comparable

MyClass没有实现Comparable。我只想使用Set来过滤List的唯一元素,因为我的List包含不必要的重复项。


问题答案:

是否MyClass implements Comparable<MyClass>或类似的东西?

如果没有,那就是为什么。

为此TreeSet,您必须制作元素Comparable或提供一个Comparator。否则TreeSet将无法运行,因为它将不知道如何对元素进行排序。

请记住,,TreeMap implements SortedSet因此它必须知道如何以一种或另一种方式对元素进行排序。

您应该熟悉实现如何为给定类型的对象Comparable
定义 自然顺序 的知识。

接口定义一个方法,compareTo如果该对象分别小于,等于或大于另一个对象,则该方法必须返回负整数,零或正整数。

合同 要求

  • sgn(x.compareTo(y)) == -sgn(y.compareTo(x))
  • 它是可传递的:x.compareTo(y)>0 && y.compareTo(z)>0隐含x.compareTo(z)>0
  • x.compareTo(y)==0 意味着sgn(x.compareTo(z)) == sgn(y.compareTo(z))对于所有人z

此外,它 建议

  • (x.compareTo(y)==0) == (x.equals(y)),即“与 equals

乍一看似乎需要消化很多,但是对于定义总排序的方式确实很自然。

如果您的对象不能以一种或另一种方式进行排序,则TreeSet没有意义。您可能要使用HashSet具有自己的合同的a。您可能会被要求@Override hashCode()并且equals(Object)适合您的类型(请参阅:Java中的覆盖equals和hashCode)



 类似资料:
  • 问题内容: 我有一个包含> 100k对象的TreeSet。我有另一种方法需要ArrayList作为参数。 我有什么方法可以完成此任务而无需迭代整个TreeSet,然后将每个对象手动添加到ArrayList? 问题答案: 这个怎么样: 对于Java 7及更高版本,这可以简化,因为类型参数可以替换为菱形类型:

  • 我试图通过将对象传递给“验证器”来验证库中的结果,其中验证器验证结果是否为空,并随后将传递的对象返回给调用方。例如: 调用方将调用以下内容: 我知道参数绑定发生在运行时,这就是编译器抛出这个错误的原因。我正试图避免使用显式类型创建多个方法,而宁愿捕获实现的所有类型。 在不上传或创建多个显式类型重载方法的情况下,有没有其他方法可以做到这一点?

  • 问题内容: 原始列表将转换为正常。为什么原始列表的列表不能转换为的列表? 背景故事 (以减轻xy问题): 我正在使用return的API 。我碰巧知道它一直都是。我计划循环并构建自己的循环,但是我在尝试编写时试图修复(但不禁止)原始类型编译器警告。 我试过了: 但是这些会导致类型不匹配错误。 有趣的是,这没有给出警告或错误: 问题答案: // #1 (does compile) List raw

  • 问题内容: 我试图将字符串列表从我的Java控制器传递到scala模板。 这是视图代码: 这是临时代码: 我遇到的错误(在Typesafe Activation Compile页面中): 类索引中的render方法不能应用于给定的类型; 必需:scala.collection.immutable.List 找到:java.util.List 原因:实际参数java.util.List无法通过方法调

  • 问题内容: 为什么写: 问题答案: 实现的对象是。 您要在其中覆盖的方法应将对象作为参数,而将其强制转换为。您的实现应描述如何与另一个进行比较。 要真正进行排序,您可能还需要制作工具,然后将实际逻辑复制粘贴到其中。

  • 问题内容: 我正在使用PriorityQueue结构来获取用户设置的一些字段,这是代码的一部分: 当我仅添加一个“学生”时没有问题,但是当我尝试捕获第二个“学生”时,应用程序将引发此异常 有人可以向我解释问题出在哪里/为什么?我花了很多时间在Web上寻找解决方案,但找不到,我在这里需要一些帮助… 问题答案: 如果不提供custom ,则对它持有的对象使用自然顺序。也就是说,它希望您的对象彼此之间。