ArrayList <Integer>上的indexOf函数在JSR 223(Rhino脚本引擎)中不起作用

Ami*_*igo 2 java arrays rhino jsr223

我尝试使用整数数组列表并检查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
}
Run Code Online (Sandbox Code Playgroud)

代码有什么问题?

Bri*_*ham 5

使用子类ArrayList获取有关正在发生的事情的更多信息:

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

如果你修改你的第一个ArrayList来使用这个子类,你会看到indexOf用a调用它java.lang.Double,但是Integer当你将它们存储在列表中时,你的数字被装箱为s.

一个可能的解决方法是使用盒装调用indexOf Integer,您可以在Javascript中创建如下:

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

当然,您可能希望将其封装在函数中,以避免每次都输入这么多内容.但即使这样做,它也很乏味且容易出错,这就是为什么我称之为解决方案的原因.

  • [我不相信有办法解决这个问题.](http://stackoverflow.com/questions/15528573/rhino-js-scriptengine-from-java-integers-in-doubles-out) (2认同)