簡體   English   中英

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

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM