gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:01:38 24 4
gpt4 key购买 nike

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com