GWT到Javascript的转换

GWT到Javascript的转换,javascript,gwt,Javascript,Gwt,在javascript控制台中,如果我这样做 a = [1,2,3] Object.prototype.toString.call(a) // gives me "[object Array]" typeof a // gives me "object" 如果我在GWT中创建arraylist并将其传递给本机方法并执行此操作 // JAVA code a = new ArrayList<Integer>(); a.push(1); a.push

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

   a = [1,2,3]
   Object.prototype.toString.call(a) // gives me "[object Array]"
   typeof a  // gives me "object"
如果我在GWT中创建arraylist并将其传递给本机方法并执行此操作

// 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"

GWT中的
ArrayList
并没有转换为纯JS数组:它是一个扩展
AbstractList
并实现一系列接口的类,在转换为JS时应该保留这些信息,以便
instanceof
检查(在Java代码中;例如,
instanceof List
instanceof RandomAccess
)仍按预期工作。
ArrayList
因此被实现为JS数组的包装器,请参阅


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

你本质上是在问GWT是如何实现的。这是你想要的,还是有更具体的东西?谢谢你的快速回答。我试图在GWT中使用JSNI,这就是所有这些问题出现的地方,因为我在JSNI中编写的方法在浏览器控制台中工作,但在GWT中不工作。根据,Java数组不能从JSNI代码。抱歉…希望该页面能帮助您实现解决方案(当然可能).Ah,看起来您需要修改类型名
ArrayList
,然后您可以使用一些难看的语法从JSNI内部调用
get
方法。@Potatoswatter,不完全是。我正试图使用这里给出的建议实现一个通用克隆功能。并在GWTThanks中使用它作为您的答复。这是否意味着,GWT translation不一定提供JS阵列提供的所有功能?我这样问是因为我试图在我的GWT应用程序中使用JSNI代码实现深度克隆功能,如本文所述。这是否应该尝试找到一个通用的“深度克隆”方法一起被揭穿?就像我给出的例子,翻译的GWT对象是否支持JS对象功能,如obj.prototype或obj.constructor?GWT翻译的对象是JS对象,所以它们确实有一个原型和一个构造函数。但是当我试图获取item.prototype或item时。在我上面的例子中,它给了我一个m、 google.gwt.core.client.JavaScriptException:(null)@daridra.client.trument::nativeMethodCode(Ljava/lang/Object;)([Java对象:Java.util。ArrayList@17122202]):nulOh,在开发模式下,这些对象不是标准的JS对象,仅在prod模式(或SuperDevMode)下
      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;
        }-*/;