Lista para a conversão de TreeSet produz: “java.lang.classCastException: myClass não pode ser lançado para java.lang.comparable”

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

  •  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.

Foi útil?

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 Comparabledefine 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 implica x.compareTo(z)>0
  • x.compareTo(y)==0 implica que sgn(x.compareTo(z)) == sgn(y.compareTo(z)) para todos z

Além disso, isso recomenda este:

  • (x.compareTo(y)==0) == (x.equals(y)), ou seja, "consistente com equals

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top