G
Guest
Gast
Hallo liebes Java-Forum,
zum ersten Mal seit zwei Jahren oder so bringt mich Java (hier 1.5) so weit, eine Frage zu stellen: Ich möchte in einem Set garantiert nur eine Implementierung eines bestimmten Interfaces oder eines von dessen Subinterfaces haben. Da die equals()-Methode aber gelichzeitig erhalten bleiben soll, habe ich ein "Wrapperobjekt" geschrieben, welches die die Implementierung kapselt und eine eigene equals-Methode zur Verfügung stellt:
Wie der Name andeutet, soll dieses Objekt nun als Schlüssel fungieren, um das Set eben bzgl. der o.g. Bedingung konsistent zu halten. Nun tritt aber im dazugehörigen Test eine ClassCastException auf, und zwar stets beim Hinzufügen des zweiten Key-Value-Pairs:
Die ClassCastException tritt also in der auch mit CCE! markierten Zeile auf. Und genau das verstehe ich nicht - kann mir jemand helfen? Ich vermute ja, dass die Typisierung der Map für mein Anwendungsziel nicht richtig ist...
Viele Grüße,
Thorsten
--
zum ersten Mal seit zwei Jahren oder so bringt mich Java (hier 1.5) so weit, eine Frage zu stellen: Ich möchte in einem Set garantiert nur eine Implementierung eines bestimmten Interfaces oder eines von dessen Subinterfaces haben. Da die equals()-Methode aber gelichzeitig erhalten bleiben soll, habe ich ein "Wrapperobjekt" geschrieben, welches die die Implementierung kapselt und eine eigene equals-Methode zur Verfügung stellt:
Code:
public class ConstraintTypeKey {
private Constraint constraint;
private static final ConstraintTypeComparator ctc = new ConstraintTypeComparator();
public ConstraintTypeKey(Constraint _c) {
this.constraint = _c;
}
@Override
public boolean equals(Object obj) {
if (obj instanceof ConstraintTypeKey) {
ConstraintTypeKey ctk = (ConstraintTypeKey) obj;
return ConstraintTypeKey.ctc.compare(
ctk.constraint, this.constraint) == 0;
}
else {
throw new ClassCastException("The object passed in was not a " +
"ConstraintTypeKey: " + obj.getClass());
}
}
}
Wie der Name andeutet, soll dieses Objekt nun als Schlüssel fungieren, um das Set eben bzgl. der o.g. Bedingung konsistent zu halten. Nun tritt aber im dazugehörigen Test eine ClassCastException auf, und zwar stets beim Hinzufügen des zweiten Key-Value-Pairs:
Code:
public void testCompare() {
// create two different constraints that implement the same interface
// line.
Constraint a = new AlternateLogicalConstraintImpl();
Constraint b = new LogicalConstraintImpl(null, null, LogicalConstraint.LogicalOperator.AND);
// a and b should be rated as equal according to this Comparator.
ConstraintTypeComparator ctc = new ConstraintTypeComparator();
int result = ctc.compare(a, b);
assertTrue(result == 0);
// a and c should not be rated as equal.
Constraint c = new LanguageConstraintImpl(Locale.GERMAN);
result = ctc.compare(a, c);
assertTrue(result != 0);
// if a, b and c are added to a Set in this order, only b and c should
// be in it.
// this part test tests consistency with equals.
Map<ConstraintTypeKey, Constraint> constraints_map =
new TreeMap<ConstraintTypeKey, Constraint>();
constraints_map.put(new ConstraintTypeKey(a), a);
constraints_map.put(new ConstraintTypeKey(b), b); // CCE!
constraints_map.put(new ConstraintTypeKey(c), c);
assertTrue(constraints_map.values().contains(b));
assertTrue(constraints_map.values().contains(c));
assertFalse(constraints_map.values().contains(a));
}
Die ClassCastException tritt also in der auch mit CCE! markierten Zeile auf. Und genau das verstehe ich nicht - kann mir jemand helfen? Ich vermute ja, dass die Typisierung der Map für mein Anwendungsziel nicht richtig ist...
Viele Grüße,
Thorsten
--