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



>我尝试使用整数的数组列表并检查其中是否存在变量。它适用于字符串数组,但不适用于整数数组。

   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
}

代码有什么问题?

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

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

如果您修改第一个 ArrayList 以使用此子类,您将看到indexOf被调用java.lang.Double,但您的数字在将它们存储在列表中时被装箱为 Integer s。

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

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

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

你可以试着告诉javascript具体的类型...

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

我怀疑这是否会与许多其他 JS 引擎兼容,但它适用于这种情况。

最新更新