2012-05-01 2 views

ответ

0

Оказывается, что getWindow возвращает новый JSObject, описывающую окно. Поэтому каждый вызов getWindow - это новый экземпляр, но с теми же данными, поэтому equals возвращает false. Оба JSObjects описывают окно, но не являются одним и тем же объектом.

public class MyClass 
{ 
    int a; 
    public MyClass(int arg) 
    { 
    a = arg; 
    } 

    public MyClass getMyClass() 
    { 
    return new MyClass(a); 
    } 

    public static void main(String args[]) 
    { 
    MyClass parent = new MyClass(1); 
    MyClass obj1 = parent.getMyClass(); 
    MyClass obj2 = parent.getMyClass(); 
    System.out.println(obj1.equals(obj2));   
    } 
} 

Это печатает false, потому что, хотя объекты имеют одинаковое значение в них, они все еще разные объекты.

Редактировать: обновлено, чтобы использовать метод get, чтобы сделать его более четким.

+0

«Оба JSObjects описывают окно, но не являются одним и тем же объектом». Вы имеете в виду, что JSObject.equals() не работает, как описано в документации, и нет способа решить, относятся ли два экземпляра JSObject к тому же Объект Javascript? – snorbi

+0

Он работает точно так, как описано. В этом примере оба obj1 и obj2 имеют одинаковые данные, '1'. Как и для вас, JSObject из обоих вызовов getWindow будет иметь одни и те же данные, но не является одним и тем же объектом. У вас две идентичные копии, но они все еще два объекта. 'Относится к тому же экземпляру' возвращает true, если они являются одним и тем же объектом с другим именем, но false, если они представляют собой разные объекты с одинаковой информацией. – Thomas

+0

«Это выводит false» - это потому, что в классе MyClass не переопределены equals (и hashCode). Но на основе документации JSObject.equals() должен работать так, как я ожидал. В других частях документации явно говорится: «Вы не можете использовать оператор == для сравнения двух экземпляров JSObject. Используйте JSObject.equals». – snorbi