3

鉴于以下情况,使用 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);
    }
}
4

1 回答 1

3

Java SE 6 规范 ( JSR 270 ) 只是说:

不要求平台支持任何特定的脚本语言;实现者可以选择包括对他们认为合适的脚本语言的支持。

据我所知,没有关于如何将 Java 类型集成到 JavaScript 中的正式规范。不幸的是,没有理由期望跨实现 100% 的兼容性。

我相信 Oracle JRE 和 OpenJDK 都与 Rhino 一起发布,但不能保证版本级别、补丁等。

于 2011-05-10T00:21:15.630 回答