2011-05-09 25 views
3

鑑於下文中,與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); 
    } 
} 
+0

只是出於好奇,如果傳遞給'replace'的論據是什麼它做擔保長度不只一個字符? – laz 2011-05-10 00:33:04

+0

我不確定我是否理解這個問題。我恰好給出了一個單字符正則表達式和單個字符串的例子,但更長的參數是可能的,並且行爲與您預期的相同(假定您熟悉支持正則表達式的東西)。 – 2011-05-10 21:31:43

+0

確定它們是可能的。我只是想知道是否將它們強制轉換爲char,因爲它們只有一個字符長,並且想知道是否更長的字符串映射到CharacterSequence。 – laz 2011-05-10 23:50:28

回答

3

的Java SE 6的規格(JSR 270)只是說:

會有不需要要求平臺支持任何 特定的腳本語言爲 ; 實現者可以選擇包括 支持他們選擇的腳本語言 。

據我所知,沒有關於如何將Java類型集成到JavaScript中的正式規範。這是不幸的,但沒有理由期望跨實現100%兼容。

相信無論是在Oracle JRE和OpenJDK的船犀牛,但沒有關於版本級別,補丁等

+0

我懷疑你是對的,而這只是未說明的。我猜這並不令人吃驚,在這種情況下並不是那麼可怕:在Javascript中正確的地方拋出'new String(...)'並不是太糟糕。 – 2011-05-13 15:14:23