2010-02-11 3 views
3

Я бы хотел, чтобы мой класс EqualTester вызывал переопределенный метод его общего параметра, но вместо этого он вызывает Object.equals. Вот мой тестовый код:Использование 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() (потому что параметр не имеет нужного типа)?

Спасибо.

ответ

7

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

Прямо сейчас вы всего лишь перегрузка метода равных.

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

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

4

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

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

2

Спасибо Padmarag и Phill!

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

@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 только несколько дней назад ...

+0

Рад, что я мог бы помочь. Если вы хотите получить более продвинутую (и сложную) информацию, попробуйте эту ссылку - http://www.artima.com/lejava/articles/equality.html – Padmarag

+0

Также используйте экземпляр перед литьем, тогда вам не понадобится попробовать ClassCastException блок. – Padmarag

+0

Сделано! Спасибо ... –

Смежные вопросы