2010-02-11 4 views
3

EqualTester 일반 클래스에서 generic 매개 변수의 재정의 된 equals(...) 메서드를 호출하려고하지만 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으로 전송해야합니다.

지금 바로 에 equals 메서드 오버로드가 있습니다..

@Override 주석을 메소드에 추가하는 것도 유용합니다.

메서드 서명을 재정의하는 경우 정확하게 일치해야합니다.

4

equals(K k)은 실제로 equals(Object o) 메서드보다 우선합니다.

은 정확히 작동하려면 equals(Object o)이어야합니다.

2

감사합니다. Padmarag and 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); 
    } 

댓글 환영 : 난 ... 단지 몇 일 전에 자바에서 내가 도움이 될 수 있다는

+0

다행를 프로그래밍을 시작했다. 좀 더 고급스럽고 까다로운 정보가 필요한 경우 http://www.artima.com/lejava/articles/equality.html – Padmarag

+0

캐스팅하기 전에 instanceof를 사용하면 ClassCastException이 필요하지 않습니다. try 블록. – Padmarag

+0

완료! 감사합니다 ... –