Lista a la conversión TreeSet produce: “java.lang.ClassCastException: MiClase no se puede convertir a java.lang.Comparable”

StackOverflow https://stackoverflow.com/questions/2504803

  •  22-09-2019
  •  | 
  •  

Pregunta

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

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

No entiendo por qué este código genera la siguiente:

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

MiClase no implementa Comparable. Sólo quiero utilizar un conjunto para filtrar los elementos únicos de la lista ya que mi lista contiene duplicados unncessary.

¿Fue útil?

Solución

¿El MyClass implements Comparable<MyClass> ni nada de eso?

Si no es así, es por eso.

Para TreeSet, ya sea que tiene que hacer el Comparable elementos, o proporcionar un Comparator. De lo contrario TreeSet no puede funcionar ya que no sabría cómo ordenar los elementos.

Recuerde, TreeMap implements SortedSet, por lo que tiene que saber el fin los elementos de una manera u otra.

Se debe familiarizarse con la forma en la implementación de Comparable define ordenamiento natural para los objetos de un tipo dado.

El define la interfaz de un método, compareTo, que debe devolver un entero negativo, cero o un número entero positivo si este objeto es menor que, igual a, o mayor que el otro objeto, respectivamente.

El contrato requiere que:

  • sgn(x.compareTo(y)) == -sgn(y.compareTo(x))
  • es transitiva: x.compareTo(y)>0 && y.compareTo(z)>0 implica x.compareTo(z)>0
  • x.compareTo(y)==0 implica que sgn(x.compareTo(z)) == sgn(y.compareTo(z)) para todos z

Además, recomienda que:

  • (x.compareTo(y)==0) == (x.equals(y)), es decir, "consistente con equals

Esto puede parecer mucho para digerir al principio, pero en realidad es bastante natural con cómo se defina de pedido total.


Si los objetos no pueden ser ordenadas de una manera u otra, a continuación, un TreeSet podría no tener sentido. Es posible que desee utilizar un HashSet lugar, que tienen sus propios contratos. Es probable que tenga que @Override hashCode() y equals(Object) de acuerdo con su tipo (véase: Anulación es igual y hashCode en Java )

Otros consejos

Si no pasa un Comparator explícita a un TreeSet, tratará de comparar los objetos (asumiendo que son Comparable). Y si no son Comparable, no puede ellos se compara, por lo que se lanza esta excepción!
TreeSets están ordenadas conjuntos y requiere ni objetos que se van Comparable o una Comparator que se pasarán en determinar cómo ordenar los objetos en el Set.

Si lo que desea es el conjunto para eliminar duplicados, que se utiliza un HashSet, a pesar de que va a cambiar el orden de los objetos devueltos por el Iterator en formas que aparecen al azar.
Pero si se quiere preservar el orden tanto, el uso LinkedHashSet, que al menos conservará el orden de inserción de la lista.

TreeSet sólo es adecuado si se necesita el Set ordenadas, ya sea mediante la implementación del objeto de Comparable o por un Comparator personalizada pasado al constructor TreeSet's.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top