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