我尝试使用整数数组列表并检查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
}
代码有什么问题?
答案 0 :(得分:5)
使用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
当然,您可能希望将其封装在一个函数中,以避免每次都输入这么多内容。但即使这样做,也很乏味且容易出错,这就是为什么我称之为解决方案。
答案 1 :(得分:0)
您可以尝试告诉javascript特定类型......
System.out.println(engine.eval("list.indexOf(new java.lang.Integer(1))"));
我怀疑它与许多其他JS引擎兼容,但它适用于这种情况。