Я пытаюсь написать некоторый общий код для определения равенства классов и хэш-кодов на основе списка полей. При написании метода equals мне было интересно, если на основе Java-соглашения должно быть возможно, чтобы два объекта разных были равными. Позвольте мне привести несколько примеров:
class A {
int foo;
}
class B {
int foo;
}
class C extends A {
int bar;
}
class D extends A {
void doStuff() { }
}
...
A a = new A(); a.foo = 1;
B b = new B(); b.foo = 1;
C c = new C(); c.foo = 1; c.bar = 2;
D d = new D(); d.foo = 1;
a.equals(b); //Should return false, obviously
a.equals(c);
c.equals(a); //These two must be the same result, so I'd assume it must be false, since c cant possible equal a
a.equals(d); //Now this one is where I'm stuck.
Я не вижу причин, что в последнем примере два не должны быть равными, но у них есть разные классы. Кто-нибудь знает, что диктует конвенция? И если они будут равны, как должен обрабатывать метод equals?
Изменить: если кто интересуется кодом, стоящим за этим вопросом, см.: https://gist.github.com/thomaswp/5816085 Это немного грязно, но я бы приветствовал комментарии суть.