List to TreeSet转换产生:"java.lang.ClassCastException:MyClass不能转换为java.lang.Comparable"

Chu*_*uck 11 java classcastexception

List<MyClass> myclassList = (List<MyClass>) rs.get();

TreeSet<MyClass> myclassSet = new TreeSet<MyClass>(myclassList);
Run Code Online (Sandbox Code Playgroud)

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

java.lang.ClassCastException: MyClass cannot be cast to java.lang.Comparable
Run Code Online (Sandbox Code Playgroud)

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

pol*_*nts 18

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

这看起来似乎很难消化,但实际上,如何定义总排序是很自然的.


如果您的对象无法以这种或那种方式订购,那么a TreeSet就没有意义了.您可能希望使用HashSet具有自己的合同的代替.您可能需要@Override hashCode()并且equals(Object)适合您的类型(请参阅:在Java中覆盖equals和hashCode)

  • 然后使用HashSet.它不会尝试对元素进行排序. (2认同)