java - JSR223 Javascript 中的回调,Oracle JRE 1.6 和 OpenJDK 1.6 之间的区别(安装在 Debian 上)

标签 java javascript openjdk jsr223

鉴于以下情况,使用 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 ) 仅仅说:

There will be no requirement that any particular scripting language be supported by the platform; implementors may choose to include support for the scripting language(s) of their choice as they see fit.

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

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

关于java - JSR223 Javascript 中的回调,Oracle JRE 1.6 和 OpenJDK 1.6 之间的区别(安装在 Debian 上),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5942840/

相关文章:

javascript - 使用 javascript 和/或 jquery 动态获取查询字符串的值并添加到对象

java - 由于新的文件夹结构,在 Linux 上的 Intellij IDEA 中正确设置 Java 9 作为 SDK

java - 为什么 java.util.Arraylist#clear 是按照它在 OpenJDK 中的方式实现的?

java - 如何减少java程序的内存消耗

java - 用我的应用程序打包 java jar 库

java - 使用 split 时出现空指针异常

java - OpenJDK 1.8 是否支持 JFR?

java - 在 Maven 中使用 ServicesResourceTransformer 时出现 ClassNotFound

javascript - 如何将 CSS 文件从源文件夹捆绑并复制到 dist 文件夹?

javascript - 单击标题时如何获取列名称/索引