List<MyClass> myclassList = (List<MyClass>) rs.get();
TreeSet<MyClass> myclassSet = new TreeSet<MyClass>(myclassList);
I don’t understand why this code generates this:
java.lang.ClassCastException: MyClass cannot be cast to java.lang.Comparable
MyClass does not implement Comparable. I just want to use a Set to filter the unique elements of the List since my List contains unncessary duplicates.
Does
MyClass implements Comparable<MyClass>or anything like that?If not, then that’s why.
For
TreeSet, you either have to make the elementsComparable, or provide aComparator. OtherwiseTreeSetcan’t function since it wouldn’t know how to order the elements.Remember,
TreeMap implements SortedSet, so it has to know how to orderthe elements one way or another.
You should familiarize yourself with how implementing
Comparabledefines natural ordering for objects of a given type.
The interface defines one method,
compareTo, that must return a negative integer, zero, or a positive integer if this object is less than, equal to, or greater than the other object respectively.The contract requires that:
sgn(x.compareTo(y)) == -sgn(y.compareTo(x))x.compareTo(y)>0 && y.compareTo(z)>0impliesx.compareTo(z)>0x.compareTo(y)==0implies thatsgn(x.compareTo(z)) == sgn(y.compareTo(z))for allzAdditionally, it recommends that:
(x.compareTo(y)==0) == (x.equals(y)), i.e. “consistent withequalsThis may seem like much to digest at first, but really it’s quite natural with
how one defines total ordering.
If your objects can not be ordered one way or another, then a
TreeSetwouldn’t make sense. You may want to use aHashSetinstead, which have its own contracts. You are likely to be required to@Override hashCode()andequals(Object)as appropriate for your type (see: Overriding equals and hashCode in Java)