Использование равенства внутри общего класса - PullRequest
3 голосов
/ 11 февраля 2010

Я бы хотел, чтобы мой универсальный класс EqualTester вызывал переопределенный метод equals(...) своего универсального параметра, но вместо этого он вызывает Object.equals. Вот мой тестовый код:

import junit.framework.TestCase;

public class EqualityInsideGenerics extends TestCase {

    public static class EqualTester<V> {
        public boolean check(V v1, V v2) {
            return v1.equals(v2);
        }
    }

    public static class K {
        private int i;
        private Object o;

        public K(Object o, int i) {
            this.o = o;
            this.i = i;
        }
        public boolean equals(K k) {
            return ((k.o != null && k.o.equals(o)) || o == null) && (k.i == i);
        }
    };

    public void testEqual() {
        K k1 = new K(null, 0);
        K k2 = new K(null, 0);
        assertTrue(k1.equals(k2));          // This one ok
        EqualTester<K> tester = new EqualTester<K>();
        assertTrue(tester.check(k1, k2));   // This one KO!
    }
}

Не могли бы вы объяснить, почему это не работает, и как я могу изменить свой EqualTester класс?

Это потому, что K на самом деле не переопределяет метод Object.equals () (потому что параметр не имеет правильного типа)?

Спасибо.

Ответы [ 3 ]

7 голосов
/ 11 февраля 2010

Вам нужно кодировать как public boolean equals(Object k), а затем приводить к k.

Сейчас вы просто перегружаете метод равных .

Также полезно добавить @Override аннотацию к методу.

При переопределении сигнатура метода должна точно совпадать.

4 голосов
/ 11 февраля 2010

Поскольку equals(K k) на самом деле не переопределяет метод equals(Object o).

Вы должны переопределить equals(Object o) именно для того, чтобы оно заработало.

2 голосов
/ 11 февраля 2010

Спасибо, Падмараг и Филл!

Решение, которое работает:

    @Override
    public boolean equals(Object obj) {
        if (!(obj instanceof K)) {
            return false;
        }
        K k = (K)obj;
        return ((k.o != null && k.o.equals(o)) || o == null) && (k.i == i);
    }

Комментарии приветствуются: я начал программировать на Java всего несколько дней назад ...

...