[英]Java Scripting (jsr223): is it possible to (re)add the rhino compile feature
[英]indexOf function on ArrayList<Integer> not work in JSR 223 (Rhino scripting engine)
我嘗試使用整數數組列表並檢查其中是否存在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
}
代碼有什么問題?
使用ArrayList
的子類來獲取有關正在發生的事情的更多信息:
List<Object> list = new ArrayList<Object>() {
public int indexOf(Object o) {
System.out.println(o.getClass());
return super.indexOf(o);
}
};
如果修改第一個ArrayList以使用此子類,則會看到使用java.lang.Double
調用indexOf
,但是將它們存儲在列表中時,它們的數字被裝箱為Integer
。
一種可能的解決方法是使用帶框的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引擎兼容,但是在這種情況下它是否可以工作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.