【问题标题】:indexOf function on ArrayList<Integer> not work in JSR 223 (Rhino scripting engine)ArrayList<Integer> 上的 indexOf 函数在 JSR 223(Rhino 脚本引擎)中不起作用
【发布时间】:2014-02-26 06:10:07
【问题描述】:

我正在尝试使用整数数组列表并检查其中是否存在 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
}

代码有什么问题?

【问题讨论】:

  • 查看代码:您使用的对象数组列表不是您所说的整数。不知道规范对此有何规定,但您确定它应该有效吗?
  • @tgkprog 不过里面有整数。无论如何,在运行时类型参数不再存在。在这两种情况下,它只是一个List。
  • 是的,我希望 Amigo 能够意识到这一点,然后下一个合乎逻辑的事情 - 向 Rhino 团队提交错误。
  • @tgkprog 我的错,复制错误的代码。但是使用整数示例列表给出相同的结果。

标签: java arrays rhino jsr223


【解决方案1】:

使用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,但您的号码在将它们存储在列表中时被装箱为 Integers。

一种可能的解决方法是使用加框的Integer 调用 indexOf,您可以像这样在 Javascript 中创建它:

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

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

【解决方案2】:

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

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

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

【讨论】:

    猜你喜欢
    • 2010-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多