7

これを行うと、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"

両者の違いは正確には何ですか?GWTJavaObjectArrayとまったく同じですか?

純粋なJavaScriptでは「オブジェクト」を返すのに、GWTでは「関数typeof」を返すのはなぜですか?

要約の質問は、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

ArrayListGWT の は純粋な JS 配列に変換されません。これは一連のインターフェースを拡張および実装するクラスでAbstractListあり、JS に変換するときにこの情報を保持して、instanceof(Java コード内のinstanceof Listまたは などのinstanceof RandomAccess) チェックが引き続き期待どおりに機能するようにする必要があります。したがって、 AnはJS 配列のラッパーArrayListとして実装されます。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 配列に変換されることに注意してください。ただし、Java の想定 (配列のサイズは固定であるなど) をさらに破る可能性があるため、JSNI での操作には十分注意してください。

于 2013-01-11T09:46:08.707 に答える