7

如果我这样做,在 javascript 控制台中,

   a = [1,2,3]
   Object.prototype.toString.call(a) // gives me "[object Array]"
   typeof a  // gives me "object"

如果我在 GWT 中创建一个数组列表并将其传递给本机方法并执行此操作,

// JAVA code
   a = new ArrayList<Integer>();
   a.push(1);
   a.push(2);

   //JSNI code
    Object.prototype.toString.call(a) // gives me "[object GWTJavaObject]"
    typeof a // returns "function"

两者之间究竟有什么区别?GWTJavaObject与Array完全相似

为什么在纯 javascript 中typeof返回“对象”而在 GWT 中返回“函数”?

总结的问题是,在 Javascript 中转换成的 GWT 对象到底是什么?完整代码在这里。

      public void onModuleLoad()
        {
                List<Integer> list = new ArrayList<Integer>();
            list.add( new Integer( 100 ) );
            list.add( new Integer( 200 ) );
            list.add( new Integer( 300 ) );

            Window.alert(nativeMethodCode( list ));
                Window.alert(nativeMethodCode2( list ));
        }

        public static final native Object nativeMethodCode( Object item )
        /*-{
            return Object.prototype.toString.call(item);
        }-*/;

        public static final native Object nativeMethodCode2( Object item )
        /*-{
            return typeof item;
        }-*/;
4

1 回答 1

3

GWT 中的 anArrayList不会转换为纯 JS 数组:它是一个扩展AbstractList并实现了一堆接口的类,并且在转换为 JS 时应保留此信息,以便instanceof检查(在您的 Java 代码中;例如instanceof Listor instanceof RandomAccess)仍然按预期工作。因此, AnArrayList被实现为JS 数组的包装器,请参阅https://code.google.com/p/google-web-toolkit/source/browse/tags/2.5.0/user/super/com/google/gwt /emul/java/util/ArrayList.java

请注意,Java 数组被转换为 JS 数组,但要非常小心在 JSNI 中对它所做的操作,因为您可能会破坏进一步的 Java 假设(例如,数组具有固定大小)。

于 2013-01-11T09:46:08.707 回答