簡體   English   中英

JSR223 Javascript中的回調,Oracle JRE 1.6和OpenJDK 1.6之間的區別(比如安裝在Debian上)

[英]Callbacks in JSR223 Javascript, difference between Oracle JRE 1.6 and OpenJDK 1.6 (as installed on, say, Debian)

鑒於以下情況,使用Oracle JRE 6運行會產生輸出boo,但OpenJDK 6會出現異常

javax.script.ScriptException: sun.org.mozilla.javascript.EvaluatorException: The choice of Java
constructor replace matching JavaScript argument types (function,string) is ambiguous; candidate 
constructors are: 
    class java.lang.String replace(char,char)
    class java.lang.String replace(java.lang.CharSequence,java.lang.CharSequence) (<Unknown source>#1) 
in <Unknown source> at line number 1

這可能是因為OpenJDK(可能是rt.jar提供它)函數獲取了一個java.lang.String ,但是使用Oracle它會得到一個JavaScript字符串(或者可以隱式強制轉換為一個)。

哪個更正確? Javascript(在這種情況下)是API,因此我們可以編寫Java,使得API對於任一實現都是相同的嗎? (如果OpenJDK實現“更正確”(並且可能是將來每個人都做的那樣),那么我想改變API(文檔,示例,測試)投入new String(...) ,如果適當的話這是不可能的,但除非我更自信,否則我寧願不對API進行丑化。)

import javax.script.*;

class st {
    public static void main(String[] args) {
        ScriptEngineManager mgr = new ScriptEngineManager();
        ScriptEngine jsEngine = mgr.getEngineByName("JavaScript");
        Bindings bindings = jsEngine.getBindings(ScriptContext.ENGINE_SCOPE);
        Foo foo = new Foo();
        bindings.put("v", foo);
        try {
            jsEngine.eval("v.run(function(a) {println(a.replace(/f/,\"b\"));})");
        } catch (ScriptException ex) {
            ex.printStackTrace();
        }    
    }
}

public class Foo {
    public void run(FooCB cb) {
        cb.run("foo");
    }
    public static interface FooCB {
        public void run(Object val);
    }
}

Java SE 6規范( JSR 270 )僅說:

不要求平台支持任何特定的腳本語言; 實現者可以選擇包括對他們所選擇的腳本語言的支持。

據我所知,沒有關於如何將Java類型集成到JavaScript中的正式規范。 這很不幸,但是沒有理由期望跨實現的100%兼容性。

我相信Oracle JRE和OpenJDK都附帶Rhino,但不保證版本級別,補丁等。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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