gpt4 book ai didi

java - 列表到 TreeSet 的转换产生 : "java.lang.ClassCastException: MyClass cannot be cast to java.lang.Comparable"

转载 作者:搜寻专家 更新时间:2023-10-30 21:20:16 24 4
gpt4 key购买 nike

List<MyClass> myclassList = (List<MyClass>) 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 为给定类型的对象定义自然顺序

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

契约(Contract)要求:

  • 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相反,它们有自己的契约(Contract)。您可能需要 @Override hashCode()equals(Object)适合您的类型(参见:Overriding equals and hashCode in Java)

关于java - 列表到 TreeSet 的转换产生 : "java.lang.ClassCastException: MyClass cannot be cast to java.lang.Comparable",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2504803/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com