Hallo zusammen
Ich habe mich gerade etwas mit equals() rumgeschlagen. Ich hätte es im Grund gerne als double dispatch implementiert. Dies klappt auch solange ich mein eigenes Interface verwende.
Sobald ich jedoch meine Objekte einem Object zuweise, kriege ich eine StackOverflow Exception. Ein explizites cast vor this bringt ebenfalls nichts (Zeile 16 & Zeile 47).
Weiss jemand weshalb?
Hier die Testklasse dazu. Wie gesagt, die drei letzten Tests fallen wegen einer StackOverflow Exception durch.
Ich habe mich gerade etwas mit equals() rumgeschlagen. Ich hätte es im Grund gerne als double dispatch implementiert. Dies klappt auch solange ich mein eigenes Interface verwende.
Sobald ich jedoch meine Objekte einem Object zuweise, kriege ich eine StackOverflow Exception. Ein explizites cast vor this bringt ebenfalls nichts (Zeile 16 & Zeile 47).
Weiss jemand weshalb?
Java:
package examples;
public class SimpleDoubleDispatch {
}
interface IWoman {
public boolean equals(Object obj);
public boolean equals(IWoman woman);
public boolean equals(Woman woman);
public boolean equals(BeardedWoman beardedWomen);
}
class BeardedWoman implements IWoman {
@Override
public boolean equals(Object obj) {
return obj.equals(this);
}
@Override
public boolean equals(Woman woman) {
return woman == null ? false : true;
}
@Override
public boolean equals(IWoman obj) {
return obj.equals(this);
}
@Override
public boolean equals(BeardedWoman bearded) {
return bearded == null ? false : true;
}
}
class Woman implements IWoman {
@Override
public boolean equals(BeardedWoman bearded) {
return bearded == null ? false : true;
}
@Override
public boolean equals(Woman woman) {
return woman == null ? false : true;
}
@Override
public boolean equals(IWoman woman) {
return woman.equals(this);
}
@Override
public boolean equals(Object obj) {
return obj.equals(this);
}
}
Hier die Testklasse dazu. Wie gesagt, die drei letzten Tests fallen wegen einer StackOverflow Exception durch.
Java:
package examples;
import static org.junit.Assert.*;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
import org.junit.Test;
@RunWith(JUnit4.class)
public class TestDoubleDispatch {
@Test
public void womanShouldBeEqualToItSelf() {
Woman woman = new Woman();
assertTrue(woman.equals(woman));
}
@Test
public void womanAsIWomanShouldBeEqualToItSelf() {
IWoman woman = new Woman();
assertTrue(woman.equals(woman));
}
@Test
public void womanAndNullShouldNotBeEqual() {
Woman woman = new Woman();
Woman woman2 = null;
assertFalse(woman.equals(woman2));
}
@Test
public void womanAndBeardedWomenShouldBeEqual() {
Woman woman = new Woman();
BeardedWoman bearded = new BeardedWoman();
assertTrue(woman.equals(bearded));
assertTrue(bearded.equals(woman));
}
@Test
public void womanAndBeardedWomanAsIWomanShouldBeEqual() {
Woman woman = new Woman();
IWoman bearded = new BeardedWoman();
assertTrue(woman.equals(bearded));
assertTrue(bearded.equals(woman));
}
@Test
public void womanAsIWomanAndBeardedWomanAsIWomanShouldBeEqual() {
IWoman woman = new Woman();
IWoman bearded = new BeardedWoman();
assertTrue(woman.equals(bearded));
assertTrue(bearded.equals(woman));
}
@Test
public void womanAsObjectShouldBeEqualToItSelf() {
Object woman = new Woman();
assertTrue(woman.equals(woman));
}
@Test
public void womanAsObjectAndBeardedWomanShouldBeEqual() {
Object woman = new Woman();
BeardedWoman bearded = new BeardedWoman();
assertTrue(bearded.equals(woman));
assertTrue(woman.equals(bearded));
}
@Test
public void womanAsObjectAndBeardedWomanAsObjectShouldBeEqual() {
Object woman = new Woman();
Object bearded = new BeardedWoman();
assertTrue(bearded.equals(woman));
assertTrue(woman.equals(bearded));
}
}