Lista para a conversão de TreeSet produz: “java.lang.classCastException: myClass não pode ser lançado para java.lang.comparable”
-
22-09-2019 - |
Pergunta
List<MyClass> myclassList = (List<MyClass>) rs.get();
TreeSet<MyClass> myclassSet = new TreeSet<MyClass>(myclassList);
Não entendo por que esse código gera isso:
java.lang.ClassCastException: MyClass cannot be cast to java.lang.Comparable
MyClass não implementa comparável. Eu só quero usar um conjunto para filtrar os elementos exclusivos da lista, pois minha lista contém duplicados não -terminados.
Solução
Faz MyClass implements Comparable<MyClass>
Ou algo assim?
Caso contrário, é por isso.
Por TreeSet
, você tem que fazer os elementos Comparable
, ou fornecer um Comparator
. Por outro lado TreeSet
Não pode funcionar, pois não saberia como pedir os elementos.
Lembrar, TreeMap implements SortedSet
, para saber como pedir os elementos de uma maneira ou de outra.
Você deve se familiarizar com a implementação Comparable
define ordem natural para objetos de um determinado tipo.
A interface define um método, compareTo
, que deve devolver um número inteiro negativo, zero ou um número inteiro positivo se esse objeto for menor que, igual ou maior que o outro objeto, respectivamente.
O contrato requer este:
sgn(x.compareTo(y)) == -sgn(y.compareTo(x))
- É transitivo:
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
Além disso, isso recomenda este:
(x.compareTo(y)==0) == (x.equals(y))
, ou seja, "consistente comequals
Isso pode parecer muito para digerir a princípio, mas realmente é bastante natural com a forma como se define a ordem total.
Se seus objetos não podem ser ordenados de uma maneira ou de outra, então um TreeSet
não faria sentido. Você pode querer usar um HashSet
Em vez disso, que têm seus próprios contratos. É provável que você seja obrigado a @Override hashCode()
e equals(Object)
conforme apropriado para o seu tipo (consulte: Substituindo iguais e hashcode em java)
Outras dicas
Se você não passa um explícito Comparator
para um TreeSet
, ele tentará comparar os objetos (assumindo que são Comparable
). E se eles não forem Comparable
, ele não pode compará -los, então essa exceção é lançada!
TreeSets
são conjuntos classificados e exigem que ambos sejam Comparable
ou a Comparator
ser passado para determinar como classificar os objetos no Set
.
Se você deseja apenas o conjunto para remover duplicatas, use um HashSet
, embora isso embaralhe a ordem dos objetos devolvidos pelo Iterator
de maneiras que parecem aleatórias.
Mas se você quiser preservar um pouco o pedido, use LinkedHashSet
, isso preservará pelo menos a ordem de inserção da lista.
TreeSet
só é apropriado se você precisar do Set
classificado, seja pela implementação do objeto de Comparable
ou por um costume Comparator
passou para o TreeSet's
construtor.