鑑於下文中,與Oracle JRE 6運行給出輸出噓聲,但OpenJDK的6給出了一個異常回調在JSR223的Javascript,甲骨文JRE 1.6和OpenJDK的1.6之間差(如安裝在,比方說,Debian的)
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字符串(或者可以被隱式強制爲1的東西)。
那哪個更正確? 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);
}
}
只是出於好奇,如果傳遞給'replace'的論據是什麼它做擔保長度不只一個字符? – laz 2011-05-10 00:33:04
我不確定我是否理解這個問題。我恰好給出了一個單字符正則表達式和單個字符串的例子,但更長的參數是可能的,並且行爲與您預期的相同(假定您熟悉支持正則表達式的東西)。 – 2011-05-10 21:31:43
確定它們是可能的。我只是想知道是否將它們強制轉換爲char,因爲它們只有一個字符長,並且想知道是否更長的字符串映射到CharacterSequence。 – laz 2011-05-10 23:50:28