I have this class, which is defined as an inner class of another class
(so it's not the most beautiful class ever, but I needed it for a
really simple task):
#######################################################################
class SimpleClass {
String attrib_one;
String attrib_two;
String attrib_three;
SimpleClass(String attrib_one, String attrib_two, String
attrib_three) {
this.attrib_one = attrib_one;
this.attrib_two = attrib_two;
attrib_three = attrib_three;
}
public boolean equals(Object obj) {
if (obj instanceof SimpleClass) {
SimpleClass sc = (SimpleClass) obj;
return(attrib_two.equals(sc.attrib_two)
&& (attrib_one.equals(sc.attrib_one))
&& (attrib_three.equals(sc.attrib_three)));
} else
return false;
}
public int hashCode() {
return attrib_one.hashCode() + attrib_two.hashCode() +
attrib_three.hashCode();
}
public String toString() {
return ("[attrib_one: " + attrib_one + "; attrib_two: " +
attrib_two + "; attrib_three: " + attrib_three + "]");
}
}
#######################################################################
As you can see, there are three attributes and three methods of the
Object class overwritten (equals(), hashCode() - i don't actually need
it -, and toString()).
Somewhere else in the code, i check if a SimpleClass object is already
in a specified TreeSet
#######################################################################
TreeSet ts = new TreeSet();
[...]
SimpleClass sc = new SimpleClass(string1, string2, string3);
if (ts.contains(sc)) {
//blah blah
}
#######################################################################
and in the "if" branch I put the generated object in the TreeSet
itself.
#######################################################################
//blah blah
ts.add(sc);
//blah blah
#######################################################################
Now, the first .contains() is executed normally (I suppose that the
TreeSet simply sees it's empty), while the second throws a
ClassCastException. I don't know why is this happening. I'm absolutely
sure that when i cast a (SimpleClass), the object IS a SimpleClass.
I've searched the archives but I didn't find any clue. I'm using java
1.4.2.
Thanks for your help.
StM
Daniel Dyer - 18 Dec 2006 14:17 GMT
> As you can see, there are three attributes and three methods of the
> Object class overwritten (equals(), hashCode() - i don't actually need
[quoted text clipped - 29 lines]
> ClassCastException. I don't know why is this happening. I'm absolutely
> sure that when i cast a (SimpleClass), the object IS a SimpleClass.
To use a TreeSet, your elements must implement Comparable or you must
provide a Comparator to the constructor. You are doing neither. You
haven't posted the actual error message, but presumably the TreeSet is
trying to cast one of its elements to Comparable and failing.
Dan.

Signature
Daniel Dyer
http://www.uncommons.org
StM - 18 Dec 2006 14:37 GMT
> To use a TreeSet, your elements must implement Comparable or you must
> provide a Comparator to the constructor. You are doing neither. You
> haven't posted the actual error message, but presumably the TreeSet is
> trying to cast one of its elements to Comparable and failing.
>
> Dan.
You're right; and I have to admit that I wouldn't have found this by
myself: the error was misleading me, and besides I had already chosen
an alternative solution; but I wanted to check anyway what I did wrong.
Thank you very much.
StM
> --
> Daniel Dyerhttp://www.uncommons.org
John Ersatznom - 18 Dec 2006 20:45 GMT
> I have this class, which is defined as an inner class of another class
> (so it's not the most beautiful class ever, but I needed it for a
[quoted text clipped - 12 lines]
> this.attrib_two = attrib_two;
> attrib_three = attrib_three;
Besides the lack of comparator or Comparable implemented, there's also
the above error. It should say "this.attrib_three = attrib_three" or the
attrib_three string of the class stays null.
StM - 19 Dec 2006 18:32 GMT
> > I have this class, which is defined as an inner class of another class
> > (so it's not the most beautiful class ever, but I needed it for a
[quoted text clipped - 14 lines]
> the above error. It should say "this.attrib_three = attrib_three" or the
> attrib_three string of the class stays null.
I think this is an error of transcription (I, uh, anonymized the names
of the variables). Thank you for pointing that out, anyway.