2013-04-14 3 views
0

Я действительно пробовал искать ответ на этом форуме для такого вопроса, но пока ничего не работает.java object равенство не работает

Я хочу напечатать проверить декларацию метода, такие как:

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

тип выражения возврата должен совпадать с типом возвращаемого методом (в данном примере это верно).

Я использую Java Tree Builder, который генерирует деревья синтаксиса для всех моих нетерминалов в моей грамматике (в виде узлов) и посетителя с глубиной по умолчанию.

У меня есть класс 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  
    } 
} 

Почему не ввести if-тело? Я также попробовал rtype.equals(acType), и он возвращает false.

Я пробовал rtype.toString.equals(acType.toString()), который также возвращает false.

Я попытался шагать в код, используя затмение отладчик и вот результат:

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

Как видно из вывода отладчика как RTYPE и acType являются IntegerType объекты.

Любая идея, почему сравнение не удается?

Если я использую если (RTYPE InstanceOf IntegerType) это возвращает истину и

Если я использую если (acType InstanceOf IntegerType) это также возвращает истину.

Но сравнение объектов всегда терпит неудачу?

Я использую JavaCC (для генерации синтаксических анализаторов), JTB (AST и посетители творец), затмение и Java 1.7

+1

Непонятно, почему вы ожидаете, что узлы будут * равными *. Мы не знаем достаточно о методе 'accept', чтобы знать, что представляют собой два узла. –

+0

Кроме того, пожалуйста, обратите внимание на форматирование вашего вопроса в будущем. Пожалуйста, прочитайте http://tinyurl.com/so-list –

+2

Сколько дубликатов «мои объекты не равны, когда я использую' == '» ...? – cHao

ответ

3

В Java == тесты для идентичности объекта - что два объекта, на самом деле, тот же объект. Вы хотите использовать .equals() для проверки на равенство . Имейте в виду, что реализация по умолчанию (в Object из equals() просто ==, если вы хотите, логическое равенство, ваши классы должны переопределить equals(Object)

Есть много ресурсов, доступных на том, как сделать это This article является довольно хорошей отправной точкой.. , как Oracle, Java tutorial

+1

Он говорит, равно', тоже. Это не один из * тех * вопросов :) –

+0

tahnks, он работает. Я проверяю реализацию метода переопределения из ответа jjnguy: http://stackoverflow.com/questions/185937/overriding-the-java-equals-method-quirk – alfu

+0

@MarkoTopolnik - речь идет не только об использовании 'equals() '; как я указываю в своем ответе, речь идет о реализации собственной логики «равно». Таким образом, это, по сути, один из «_those_» вопросов - OP даже думает, что это решило его проблему. :) –

1

Я вижу две потенциальные проблемы:..

(1) rtype == acType редко когда-либо, что вы хотите использовать equals.Но так как вы сказали, что уже использовали его, и это не помогло, вот второй вопрос:

(2) Либо определение equals - это не то, что вы думаете, или значения не то, что вы думаете о них , Прежде всего, напечатайте rtype.getClass() и acType.getClass(), чтобы узнать точные типы объектов. Затем получите исходный код этих классов (при условии, что библиотеки, которые вы используете, являются открытым исходным кодом) и посмотрите, как определяются их методы equals. Затем переходите к проверке значений сравниваемых полей методом equals.

+0

Спасибо. rtype.getClass() и acType.getClass() возвращают объекты того же типа. Как указано «Ted Hopp», они вызывают метод equals() класса Object, который также просто равен ==. Но если я переопределяю метод equals() в моем классе IntegerType, сравнение выполняется. – alfu

Смежные вопросы