Оказывается, что 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
, чтобы сделать его более четким.
«Оба JSObjects описывают окно, но не являются одним и тем же объектом». Вы имеете в виду, что JSObject.equals() не работает, как описано в документации, и нет способа решить, относятся ли два экземпляра JSObject к тому же Объект Javascript? – snorbi
Он работает точно так, как описано. В этом примере оба obj1 и obj2 имеют одинаковые данные, '1'. Как и для вас, JSObject из обоих вызовов getWindow будет иметь одни и те же данные, но не является одним и тем же объектом. У вас две идентичные копии, но они все еще два объекта. 'Относится к тому же экземпляру' возвращает true, если они являются одним и тем же объектом с другим именем, но false, если они представляют собой разные объекты с одинаковой информацией. – Thomas
«Это выводит false» - это потому, что в классе MyClass не переопределены equals (и hashCode). Но на основе документации JSObject.equals() должен работать так, как я ожидал. В других частях документации явно говорится: «Вы не можете использовать оператор == для сравнения двух экземпляров JSObject. Используйте JSObject.equals». – snorbi