2014-10-21 5 views
0

자바에서 equals() 메서드를 재정의하면 Object이 매개 변수가되어야한다는 것을 알고 있지만 궁금합니다 - 왜 Object?Java에서 equals()가 Object로 매개 변수로 전달되어야하는 이유는 무엇입니까?

둘째, (그 equals() 방법 우리가 오버라이드 (override) 클래스 인 MyClass을) 우리가 hashcode()을 무시하고 equals()을 구현하지만, MyClass 대신 Objectequals()의 매개 변수를 설정 가정 해 봅시다. HashMap을 사용하면 예상되는 동작을 계속 얻을 수 있습니까?

업데이트 : 예, 오버라이드 대신 오버로드됩니다. 하지만 HashMapequals()이 오버로드 된 경우 어떻게됩니까? 또한 관련 게시물에서 답변을 찾지 못했습니다. 아니면 내가 빠진 것이 명백한가요?

+1

"equals()를 구현하지만 equals()의 매개 변수를 Object"- "대신 MyClass로 설정하면 equals를 재정의하지 않습니다. – Mena

+1

오브젝트가 매개 변수 인 이유에 대해 연결된 URL이 OP 질문에 대답하는지 여부가 확실하지 않습니다. – seteropere

+0

@seteropere 방금 살펴 봤지만 답을 찾지 못했습니다. – user3817287

답변

2

매개 변수가 Object가 아닌 equals() 메서드를 작성하면 오버라이드하지 않고 메서드가 오버로드됩니다.

이제 HashMap - HashMap과 같이 호출하면 키를 비교합니다. 비교되는 키의 유형은 Object입니다. 따라서 Object이 아닌 매개 변수를 사용하여 equals() 메서드를 정의하면이 메서드는 HashMap에 의해 무시됩니다.

나는 다음과 같은 코드를 시도 : "발견"

public class SomeClass 
{ 
    int privateMember; 

    // note it's important to override hashCode, since if the hashCode of two 
    // keys is not the same, equals() won't be called at all 
    public int hashCode() 
    { 
     return privateMember; 
    } 

    public boolean equals (Object other) 
    { 
     if (other instanceof SomeClass) { 
      return this.privateMember==((SomeClass)other).privateMember; 
     } 
     else { 
      return false; 
     } 
    } 

    public static void main(String[] args) 
    { 
     HashMap<SomeClass,String> map = new HashMap<SomeClass,String>(); 
     SomeClass s1 = new SomeClass(); 
     SomeClass s2 = new SomeClass(); 
     s1.priv=4; 
     s2.priv=4; 
     map.put (s1, "something"); 
     if (map.containsKey (s2)) { 
      System.out.println ("found!"); 
     } else { 
      System.out.println ("not found!"); 
     } 
    } 
} 

이 코드 출력을. 당신이 동일한 코드를 실행하지만, 함께 equals 방법을 대체 할 경우

이제 :

public boolean equals (SomeClass other) 
    { 
     if (other instanceof SomeClass) { 
      return this.privateMember==((SomeClass)other).privateMember; 
     } 
     else { 
      return false; 
     } 
    } 

출력은 "을 (를) 찾을 수 없습니다!"할 것이다, 우리의 equals 방법은 무시되었습니다 의미합니다.

+0

실제로, 링크 된 URL에서 언급 한 HashMap과 동일한 예기치 않은 동작이 발생합니까? – user3817287

+0

확실히. HashMap에는 Object.equals에 연결된 무언가가 필요합니다. Object.equals는 Object 유형의 입력을 받아 들여야합니다. –

+0

@ user3817287 편집 된 답변을 참조하십시오. – Eran

0

컬렉션은 Object 기본 클래스의 equals 및 hashcode 메서드를 사용합니다. 따라서 사용자 정의 클래스가 구현을 제공하려면이를 대체해야합니다. 원하는 경우 equals를 오버로드 할 수 있으며, 이는 일부 코드가 MyClass의 인스턴스를 처리하고 있음을 알고있는 상황에서 작동합니다. 그러나 이것은 잘못된 것입니다.

모든 컬렉션 클래스는 Object 인스턴스에서 작동하도록 설계되었으며 Object는 범용 equals 메서드를 제공합니다.

직접 equals 메소드를 직접 작성하지 않아도됩니다. IDE를 사용하여 생성하거나 Apache Commons (https://commons.apache.org/proper/commons-lang/javadocs/api-3.1/org/apache/commons/lang3/builder/EqualsBuilder.html)의 EqualsBuilder를 사용하여 모두 함께 사용할 수 있습니다.