Было бы возможно переопределение equals () с несколькими экземплярами тестов для разных объектов? - PullRequest
1 голос
/ 28 октября 2011

Скажем, у меня есть класс, в котором мне нужно было бы проверять наличие нескольких типов объектов.Будет ли возможно / возможно переопределить equals() следующим образом?

public boolean equals(Object o){
    if(o == null) return false;
    if(o instanceof class1){
        return this.class1.equals((class1) o);
    if(o instanceof class2){
        return this.class2.equals((class2) o);
    ...

}

Будет ли это когда-нибудь полезным?Здесь я предполагаю, что я создаю статический перегруженный метод equals() в соответствующих классах (хотя, может быть, полиморфизм позаботится об этом автоматически, пока я произношу?).

Ответы [ 4 ]

3 голосов
/ 28 октября 2011

Я очень сильно сомневаюсь, что, поскольку вы можете легко нарушить транзитивность равных таким образом (x.equals(y) && x.equals(z) подразумевает y.equals(z))

Если, конечно, вы не проводите очень тщательную настройку, включающую все классы, но это было бы затруднительно, чтобы получить права

1 голос
/ 28 октября 2011

Похоже, вы хотите, чтобы метод проверял, равен ли указанный объект хотя бы одной из различных переменных-членов в получателе.

Неуместно переопределять java.lang.Object # равно для этой цели.

Вместо этого вы должны указать другой метод, например,

public boolean hasEquals(Object o) { // your impl }
1 голос
/ 28 октября 2011

Семантически, я не думаю, что это хорошая идея. Равные должны быть основаны не на типах классов, а на переменных экземпляра. Кроме того, яблоко никогда не должно быть равным груше, а только другим яблокам.

0 голосов
/ 29 октября 2011

Если вы уверены, что это не приведет к взаимной рекурсии, вы можете просто вернуть that.equals(this).Однако в общем случае равенство объектов подразумевает либо равенство классов, либо, по крайней мере, связное наследование между ними.

...