Lista a la conversión TreeSet produce: “java.lang.ClassCastException: MiClase no se puede convertir a java.lang.Comparable”
-
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.
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
implicax.compareTo(z)>0
-
x.compareTo(y)==0
implica quesgn(x.compareTo(z)) == sgn(y.compareTo(z))
para todosz
Además, recomienda que:
-
(x.compareTo(y)==0) == (x.equals(y))
, es decir, "consistente conequals
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
.