2

整数の配列リストを使用して、その中に var が存在することを確認しようとしています。文字列の配列では機能しますが、整数の配列では機能しません。

   public static void main(String[] args) throws ScriptException {
    List<Object> list = new ArrayList<Object>();
    list.add(1);
    list.add(2);

    List<String> lists = new ArrayList<String>();
    lists.add("1");
    lists.add("2");

    ScriptEngineManager factory = new ScriptEngineManager();
    ScriptEngine engine = factory.getEngineByName("JavaScript");
    engine.put("list", list);
    System.out.println(engine.eval("list.indexOf(1)"));
    //print -1 , Why ?

    engine.put("lists", lists);
    System.out.println(engine.eval("lists.indexOf('1')"));
    //print 0
}

コードの何が問題なのですか?

4

2 に答える 2

6

のサブクラスを使用して、ArrayList何が起こっているかについての詳細情報を取得します。

List<Object> list = new ArrayList<Object>() {
    public int indexOf(Object o) {
        System.out.println(o.getClass());
        return super.indexOf(o);
    }
};

このサブクラスを使用するように最初の ArrayList を変更すると、それがindexOfa で呼び出されていることがわかりますが、数値をリストに格納するときに sjava.lang.Doubleとしてボックス化されています。Integer

Integer考えられる回避策の 1 つは、次のように Javascript で作成できるboxed で indexOf を呼び出すことです。

System.out.println(engine.eval("list.indexOf(java.lang.Integer.valueOf(1))"));
// now outputs 0

もちろん、毎回入力する手間を省くために、関数にカプセル化することをお勧めします。しかし、それを行っても、退屈でエラーが発生しやすいため、回避策と呼んでいます。

于 2014-02-26T06:17:35.087 に答える
0

特定のタイプをjavascriptに伝えてみることができます...

System.out.println(engine.eval("list.indexOf(new java.lang.Integer(1))"));

他の多くの JS エンジンと互換性があるとは思えませんが、この場合は機能します。

于 2014-02-26T06:38:52.490 に答える