2011-11-24 3 views
0

ArrayBag라는 제너릭 클래스가 있습니다. equals 메서드를 재정의하려고합니다. 그래서 나는은 java 제네릭 클래스의 메서드와 동일합니다.

public boolean equals(T other){ 

} // gives error 
을 썼다

오류 메시지 : 이름 충돌 : 형 ArrayBag의 방법은 동일 (T)는 Object 형식의 등호 (객체)와 같은 삭제가 있지만 재 지정을하지 않는 것이

+0

그것은'Override' 주석 @ 너무 사용하는 좋은 방법입니다. – Michael

+0

제네릭을 사용하지 않더라도 항상 "equals (Object)"를 작성해야합니다. – DJClayworth

+0

고맙습니다 ... –

답변

5

대체하려고하는 equals 메소드에는 Object이 필요합니다. 코드가 바이트 코드로 변환되면 지우개를 입력하여 TObject으로 변환합니다. 이는 기존의 equals 메서드와 충돌합니다. 당신이 T에 캐스팅 처리 할 수있는 방법 내부

@Override 
public boolean equals(Object other) { 
    if (other instanceof T) 
    { 
     T o = (T) other; 
     ... 
    } 
} 

.

+0

많은 친구를 도와줍니다 .. 또한 instanceOf가 무엇인지 설명해 주시겠습니까 ?? –

+0

'instanceof'는'other' 객체가'T' 타입인지 확인합니다. 이렇게하면 객체를 캐스팅 할 때 발생 가능한 예외가 발생하지 않습니다. 타입이 'T'가 아닌 경우, equals 메소드는 false를 리턴해야합니다. –

+0

instanceof를 사용할 때 제네릭 클래스에 오류가 있습니다. 링크는 세부 정보를 설명합니다. http://stackoverflow.com/questions/5734720/java-generics-obj-instanceof-t. 즉, "instanceof"키워드는 java 제네릭 클래스에서 사용할 수 없습니다. – zhfkt

2

equals(Object other)equals(T other)를 교체 한 다음 메소드 구현 내부 Tother를 캐스팅.

+0

물체가 T의 인스턴스인지 먼저 확인하지 않고 캐스팅에주의하십시오. ClassCastException으로 끝날 수도 있습니다. –

0

당신이 필요합니다.

public boolean equals(Object other){ 
     T t = (T) other; 

} 
0

메서드를 재정의해야 할 때마다 서명은 재정의 할 메서드와 동일해야합니다. 따라서 Object를 equals 메서드에 하나의 유일한 인수로 전달하여 원하는대로 작동하도록해야합니다.

Grantham의 솔리드 솔루션 대신 instanceof 대신 getClass()를 사용할 수 있습니다. 예를 들어 일반 클래스를 확장하려고 계획하고 하위 클래스 인스턴스가 수퍼 클래스 인스턴스와 같지 않게하려면. 같을 것이다

는 :

@Override 
public boolean equals(Object other) { 
    if (other != null && getClass() == other.getClass()) { 
     T o = (T) other; 

     // ... 

    } 
    return false; 
} 
관련 문제