鉴于以下情况,使用 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/