Pourquoi ne TreeSet jeter un ClassCastException?
Je suis en train d'ajouter deux "Employés" des objets à un TreeSet:
Set<Employee> s = new TreeSet<Employee>();
s.add(new Employee(1001));
s.add(new Employee(1002));
Mais il jette un ClassCastException:
Exception in thread "main" java.lang.ClassCastException: Employee cannot be cast to java.lang.Comparable
at java.util.TreeMap.put(TreeMap.java:542)
at java.util.TreeSet.add(TreeSet.java:238)
at MyClient.main(MyClient.java:9)
Mais si j'ajoute un seul objet à la TreeSet:
Set<Employee> s = new TreeSet<Employee>();
s.add(new Employee(1001));
Ou si j'utilise un HashSet à la place:
Set<Employee> s = new HashSet<Employee>();
s.add(new Employee(1001));
s.add(new Employee(1002));
Alors c'est réussi. Pourquoi l'exception arriver et comment puis-je résoudre ce problème?
- Vous avez besoin de faire confiance que le message d'erreur est correct.
Employee cannot be cast to java.lang.Comparable
est le problème. Lorsque vous avez un élément, il n'est rien à comparer de sorte qu'il ne détecte pas le problème. HashSet n'utilise pas Comparables, de sorte qu'il ne vérifie pas non plus.
Vous devez vous connecter pour publier un commentaire.
Soit
Employee
a à mettre en œuvreComparable
, ou vous avez besoin de fournir un élément de comparaison lors de la création de laTreeSet
.Cela est précisé dans la documentation pour
SortedSet
:Si vous n'avez pas de satisfaire à ces exigences, l'ensemble trié ne savez pas comment faire pour comparer ses éléments et ne pas être en mesure de fonctionner.
TreeSet
exige des éléments pour mettre en œuvre lesComparable
interface si une coutumeComparator
n'est pas définie.HashSet
utilise leequals
/hashCode
contrat à la place.Vous pouvez ajouter un seul élément dans
TreeSet
qui ne permet pas de mettre en œuvreComparable
parce qu'il n'a pas besoin d'être comparés avec d'autres éléments.Prendre un coup d'oeil à la
TreeMap.put(K key, V value)
code source et vous verrez clairement les raisons derrière toutes vos questions (TreeSet
est basé surTreeMap
, d'où la référence à la source).De TreeSet#ajouter(E) JavaDoc:
Fondamentalement, ce que vous avez besoin est de laisser
Employee
mettre en œuvreComparable
ou de fournir unComparator
à laTreeSet
objet.Si vous cochez
TreeMap
code, vous verrez que si la comparaison n'a pas été trouvé dans laMap
objet, il va essayer de jeter la clé (votreEmployee
objet) directement àComparator
:Donc implémenter l'interface Comparable à l'Employé de l'objet en tant que de besoin lorsque vous utilisez TreeSet, parce que TreeSet veut garder les éléments triés.
TreeSet
est une implémentation deSortedSet
. Vous pouvez soit laisserEmployee
mettre en œuvre lesComparable
de l'interface ou de fournir unComparator
pour votreTreeSet
: