Class.getSuperclass()에 문제가 있습니다. 각 클래스의 속성을 다른 클래스와 비교 한 후 equals 요청을 부모에게 전달하는 클래스 계층 구조를 생성하려고합니다. 이 접근법을 사용하면 객체가 isSame 비교를 수행하고 내가 원한 것이 아니기 때문에 객체 위의 레벨에 도달했을 때 super.equals를 호출하는 것을 중지해야합니다.Super.equals 호출 체인에서 Object에 도달했는지 확인하는 방법은 무엇입니까?
class Child extends Parent {
...
public boolean equals(Object other) {
... compare my attributes to other, if everything matches:
if (myImmediateSuperIsObject()) {
return true;
} else {
return super.equals(other)
}
}
}
class Parent extends Object {
public boolean equals(Object other) {
... compare my attributes to other, if everything matches:
if (myImmediateSuperIsObject()) {
return true;
} else {
return super.equals(other)
}
}
}
문제는 myImmediateSuperIsObject 의사 호출입니다 : 가정하자
나는이 계층 구조를 가지고있다. 그것을 쓰는 방법? Parent.equals가 Child.equals로부터 불려 갔을 경우, Parent 내에서 this.getClass(). getSuperclass()는 Object는 아니고 Parent가됩니다. 이는 getSuperclass()를 호출 할 때 항상 인스턴스 인 클래스 인 Child에서 시작하기 때문입니다. 그래서 null을 얻을 때까지 재귀 적으로 getSuperclass를 호출하여 전체 계층 구조를 만들 수 있습니다. 그러나 Object를 호출하는 체인에서 Object 이상인지 어떻게 확인할 수 있습니까?
다시 말해서 클래스 계층을 생성해야하기 때문에 모든 문제가 있습니다. 이것을 수동으로 작성한다면 객체를 확장하고 super.equals()를 호출하는 것을 중지한다는 것을 알 수 있습니다.
아이디어가 있으십니까?
안부, 디트리히
계층 구조 트리의 루트로 정의하는'Object'와'Parent' 사이에 하나의 추상 클래스를 도입하는 것은 어떻습니까? 그 클래스에서, 당신은 더 이상 아무것도하지 않기 위해'equals'를 override 할 수 있습니다. –
Parent 클래스는 Object를 확장합니다. 수퍼 클래스가 Object인지 테스트 할 필요가 없습니다. 그것은, 그리고 그것은 바꿀 수 없습니다. 그래서 자식이'super.equals()'를 호출하게하십시오. –
"Object는 isSame 비교를 수행하며 원하는 것은 아닙니다." 이 일을하는 것이 어떤 차이를 만들지 아니면 단지 학문적 인 질문이 될 수있는 예를 제시 할 수 있습니까? –