I am trying to add two 'Employee' objects to a TreeSet:
Set<Employee> s = new TreeSet<Employee>();
s.add(new Employee(1001));
s.add(new Employee(1002));
But it throws a 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)
But if I add only one object to the TreeSet:
Set<Employee> s = new TreeSet<Employee>();
s.add(new Employee(1001));
Or if I use a HashSet instead:
Set<Employee> s = new HashSet<Employee>();
s.add(new Employee(1001));
s.add(new Employee(1002));
Then it is successful. Why does the exception happen and how do I fix it?
ClassCastException is a runtime exception raised in Java when we try to improperly cast a class from one type to another. It's thrown to indicate that the code has attempted to cast an object to a related class, but of which it is not an instance.
Class ClassCastException Thrown to indicate that the code has attempted to cast an object to a subclass of which it is not an instance. For example, the following code generates a ClassCastException : Object x = new Integer(0); System.
To prevent the ClassCastException exception, one should be careful when casting objects to a specific class or interface and ensure that the target type is a child of the source type, and that the actual object is an instance of that type.
It is a runtime exception that occurs when the application code attempts to cast an object to another class of which the original object is not an instance. For example, a String object cannot be cast to an Integer object and attempting to do so will result in a ClassCastException .
Either Employee
has to implement Comparable
, or you need to provide a comparator when creating the TreeSet
.
This is spelled out in the documentation for SortedSet
:
All elements inserted into a sorted set must implement the
Comparable
interface (or be accepted by the specified comparator). Furthermore, all such elements must be mutually comparable:e1.compareTo(e2)
(orcomparator.compare(e1, e2)
) must not throw aClassCastException
for any elementse1
ande2
in the sorted set. Attempts to violate this restriction will cause the offending method or constructor invocation to throw aClassCastException
.
If you don't fulfil these requirements, the sorted set won't know how to compare its elements and won't be able to function.
TreeSet
requires elements to implement the Comparable
interface if a custom Comparator
is not set. HashSet
uses the equals
/hashCode
contract instead.
You can add only one element into TreeSet
which does not implement Comparable
because it does not need to be compared with other elements.
Take a look at the TreeMap.put(K key, V value)
source code and you'll clearly see the reasons behind all your questions (TreeSet
is based on TreeMap
, hence the source reference).
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With