2013-04-14 2 views
0

저는이 포럼에서 이러한 질문에 대한 답변을 검색하려고 시도했지만 아무도 지금까지는 작동하지 않는 것 같습니다.java 객체 평등이 작동하지 않습니다.

public int stackOverFlow() {int a; a = a + 1; return 0;} 

(이 예에서는 사실) 메소드의 반환 유형과 일치해야합니다 반환 식의 유형 :

나는 같은 메소드 선언을 확인 입력합니다.

자바 트리 빌더는 내 문법 (노드 형식)과 기본 깊이 우선 방문객으로 모든 비 터미널에 대한 구문 트리를 생성합니다.

Node 인터페이스를 구현하는 MethodDeclaration 클래스가 있습니다. 노드 인터페이스의 형식은 다음과 같습니다.

public Node accept(TypeVisitor v){ return v.visit(v)); 

이 인수 방법을 사용하면 TypeVisitor가 MethodDeclaration을 방문 할 수 있습니다.

지금 메소드 선언을 방문, 나는 왜이 경우 바디를 입력하지 않습니다

public Node visit(MethodDeclaration n){ 

    // this visits the f10 Node, which is the return expression, 
    // and returns a specific Node object 
    Node rtype = n.f10.accept(this); 

    // this also does a similar thing by visitng the f1 Node, 
    // the method's return type, and returns a specific Node Object 
    Node acType = n.f1.accept(this); 

    // Now if I compare the two specific Node objects, it always fails. 

    if(rtype == acType){  
     //enter here  
    } 
} 

을 확인하는 간단한 형식을합니까? 또한 rtype.equals(acType) 시도하고 false를 반환합니다.

나는 또한 false를 반환하는 rtype.toString.equals(acType.toString())을 시도했습니다.

rtype IntegerType (id=67)  
acType IntegerType (id=69)  

같이 디버거 출력 모두 RTYPE 및 acType로부터 알 수

가 IntegerType 개체 : 여기 이클립스 디버거를 이용하여 상기 코드에 스테핑 시도

출력한다.

비교가 실패한 이유는 무엇입니까?

내가 (IntegerType instanceof를 acType)이도 true를 돌려주는 경우 사용하는 경우 (IntegerType instanceof를 RTYPE가)이

를 true를 돌려 경우 내가 사용하는 경우.

그러나 개체 비교는 항상 실패합니까?

내가 (파서 세대) JavaCC에 사용하고, JTB (AST 및 방문자 창조자), 일식 및 자바 개체 식별 1.7 자바에서

+1

노드가 * 같을 것이라고 기대하는 이유는 분명하지 않습니다. 우리는 두 노드가 무엇을 나타내는지를 알기 위해'accept' 메소드에 대해 충분히 알지 못합니다. –

+0

또한 미래에는 서식을 세 심하게주의하십시오. http://tinyurl.com/so-list –

+2

을 읽으십시오. "=='"have ...를 사용할 때 "내 객체가 같지 않습니다. – cHao

답변

3

, == 테스트 - 두 개체가 있다는 사실, 같은 대상. .equals()을 사용하여 개체 평등을 테스트하려면입니다. equals()Object의 기본 구현 (단순히 == 것을 알고 있어야합니다, 당신은 논리적 평등을 원한다면, 당신의 클래스가 equals(Object)를 재정의해야합니다

자원의 많은이 작업을 수행하는 방법에 사용할 수있다

This article이 꽤 좋은 출발점이다.. 으로는 오라클의 Java tutorial

+1

그는' 평등하다. 이것은 * 그 * 질문 중 하나가 아닙니다 :) –

+0

tahnks, 그것은 작동합니다. 내가 jjnguy에 의해 답변에서 재정의 메서드에 대한 구현을 확인하십시오 : http://stackoverflow.com/questions/185937/overriding-the-java-equals-method-quirk – alfu

+0

@ MarcoTopolnik - 그것은 단지 'equals()'; 내 답변에서 지적한 것처럼, 그것은 자신의 '평등'논리를 구현하는 문제입니다. 그래서 이것은 사실 "_those_"질문 중 하나입니다 - OP는 자신의 문제를 해결했다고 생각하기까지합니다. :) –

1

나는 두 가지 잠재적 인 문제를 참조하십시오..

(1) rtype == acType은 거의 이제까지 당신이 원하는 무엇을 equals를 사용합니다.하지만 이미 사용했다고 말했기 때문에 두 번째 문제가 있습니다.

(2) equals의 정의는 사용자가 생각하는 것이 아니거나 사용자가 생각하는 값이 아닙니다. . 먼저, rtype.getClass()acType.getClass()을 인쇄하여 개체의 정확한 유형을 확인하십시오. 그런 다음 해당 클래스의 소스 코드를 가져오고 (사용하는 라이브러리가 오픈 소스라고 가정) 해당 메소드가 정의 된 방법을 확인하십시오. 그런 다음 equals 메소드로 비교되는 필드 값을 확인하십시오.

+0

감사합니다. rtype.getClass() 및 acType.getClass()는 동일한 유형의 객체를 반환합니다. "Ted Hopp"에 의해 지적 되었 듯이 그들은 단순히 == 인 Object 클래스의 equals() 메서드를 호출합니다. 그러나 IntegerType 클래스에서 equals() 메서드를 재정의하면 비교가 작동합니다. – alfu

관련 문제