Warum TreeSet werfen eine classcastexception-Fehler?
Ich versuche, fügen Sie zwei "Mitarbeiter" der Objekte zu einem TreeSet:
Set<Employee> s = new TreeSet<Employee>();
s.add(new Employee(1001));
s.add(new Employee(1002));
Aber es wirft eine classcastexception-Fehler:
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)
Aber wenn ich nur ein Objekt der TreeSet:
Set<Employee> s = new TreeSet<Employee>();
s.add(new Employee(1001));
Oder wenn ich mit einem HashSet statt:
Set<Employee> s = new HashSet<Employee>();
s.add(new Employee(1001));
s.add(new Employee(1002));
Dann ist es erfolgreich. Warum gilt die Ausnahme passieren und wie behebe ich es?
- Sie müssen darauf Vertrauen, dass die Fehlermeldung korrekt ist.
Employee cannot be cast to java.lang.Comparable
ist das problem. Wenn Sie ein element, es gibt nichts zu vergleichen, so dass es nicht das problem erkennen. HashSet nicht Vergleichbar sind, so es nicht überprüft, es entweder.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Entweder
Employee
zu implementieren hatVergleichbar
, oder Sie brauchen, um bieten einen Komparator bei der Erstellung derTreeSet
.Dies ist geschrieben in der Dokumentation für
SortedSet
:Wenn Sie nicht erfüllen diese Anforderungen, die sortierte Menge nicht wissen, wie Sie zu vergleichen, Ihre Elemente und nicht in der Lage zu funktionieren.
TreeSet
sind Elemente zur Umsetzung derComparable
- Schnittstelle, wenn Sie eine benutzerdefinierteComparator
ist nicht festgelegt.HashSet
verwendet dieequals
/hashCode
Vertrag statt.Können Sie fügen Sie nur ein element in
TreeSet
die nicht implementiertComparable
weil es nicht verglichen werden mit anderen Elementen.Werfen Sie einen Blick auf die
TreeMap.put(K key, V value)
source-code und sehen Sie genau den Gründen, die hinter alle Ihre Fragen (TreeSet
basiert aufTreeMap
, daher auch die Quellenangabe).Vom TreeSet#add(E) JavaDoc:
Im Grunde, was Sie brauchen, ist zu lassen
Employee
implementierenComparable
oder einenComparator
zu denTreeSet
Objekt.Wenn Sie das Kontrollkästchen
TreeMap
code, den Sie sehen, dass, wenn der Komparator nicht innerhalb derMap
Objekt, er wird versuchen, die Besetzung der key (IhrEmployee
Objekt) direkt anComparator
:So implementieren Vergleichbare Schnittstelle zu Mitarbeiter-Objekt, wie es benötigt wird, wenn Sie mit TreeSet, weil TreeSet will, um Elemente sortiert.
TreeSet
ist eine Implementierung vonSortedSet
. Sie können entweder lassen SieEmployee
Umsetzung derComparable
- Schnittstelle oder einen entsprechendenComparator
für IhreTreeSet
: