JSR223 Javascript中的回调,OracleJRE1.6和OpenJDK1.6之间的差异(如安装在Debian上)
考虑到以下情况,使用OracleJRE6运行会给出输出boo,但OpenJDK6会给出一个异常JSR223 Javascript中的回调,OracleJRE1.6和OpenJDK1.6之间的差异(如安装在Debian上),java,javascript,openjdk,jsr223,Java,Javascript,Openjdk,Jsr223,考虑到以下情况,使用OracleJRE6运行会给出输出boo,但OpenJDK6会给出一个异常 javax.script.ScriptException: sun.org.mozilla.javascript.EvaluatorException: The choice of Java constructor replace matching JavaScript argument types (function,string) is ambiguous; candidate construc
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
及
Java SE 6规范()只说:
不会要求任何
可以使用特定的脚本语言
由平台支持;
实现者可以选择包括
对脚本语言的支持
在他们看来,这是他们的选择
据我所知,没有正式的规范说明如何将Java类型集成到JavaScript中。这是不幸的,但没有理由期望实现之间100%的兼容性
我相信OracleJRE和OpenJDK都附带Rhino,但是版本级别、补丁等方面没有保证。只是出于好奇,如果传递到
replace
的参数长度超过一个字符,它会做什么?我不确定我是否理解这个问题。我碰巧给出了一个使用单字符regexp和单字符字符串的示例,但是更长的参数是可能的,并且其行为与您预期的一样(假设您熟悉支持regexp的内容)。确保它们是可能的。我只是想知道它是否强制将它们转换为char,因为它们只有一个字符长,并且想知道更长的字符串是否映射到CharacterSequence.AFAIK相关的东西是JavascriptString
对象(正则表达式可能是RegExp
对象),即使它们恰好只有一个字符长。(然而,我不是Javascript专家,所以可能我弄错了。)我怀疑你是对的,这只是没有具体说明。我想这并不奇怪,在这种情况下也不那么可怕:在Javascript的正确位置插入新字符串(…)
,也不算太糟糕。
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);
}
}