Pourquoi TreeSet renvoie ClassCastException
Dans le code ci-dessous je suis en train d'ajouter deux employés de l'objet
Set<Employee> s = new TreeSet<Employee>();
s.add(new Employee(1001));
s.add(new Employee(1002));
Mais le Résultat est java.lang.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 je change de.
Set<Employee> s = new TreeSet<Employee>();
s.add(new Employee(1001));
Ou
Set<Employee> s = new HashSet<Employee>();
s.add(new Employee(1001));
s.add(new Employee(1002));
Alors le résultat est le succès n'est pas une exception. Je ne fais pas toute la classe de la coulée de l'activité dans le code ci-dessus. S'il vous plaît aidez-moi à trouver la cause et de me suggérer une solution.
source d'informationauteur Rais Alam
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.
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
nécessite pour les éléments à mettre en œuvreComparable
si une coutumeComparator
n'est pas définie.HashSet
utilise est égal à/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 à
TreeMap.put(K key, V value)
les codes 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
:TreeSet
est une implémentation deSortedSet
. Vous pouvez soit laisserEmployee
mettre en œuvre lesComparable
de l'interface ou de fournir unComparator
pour votreTreeSet
: