2011-07-18 9 views
8

(Mozilla)Rhinoを使用しているときにJavaScriptとJavaの間で型を変換する方法のルールが不明です。Javaと(Rhino)Javascriptの間で共通の型を渡す

そこには、ドキュメントのいくつかの詳細についてStringです:

これは、Java文字列とJavaScript 文字列が同じ[...] Rhinoが間 違いを減らすのにいくつかの助けを提供していないことを心に留めておくことが重要です2つのタイプ。まず、JavaScriptコード をJava文字列を必要とするJavaメソッドに渡し、Rhinoは 変換を実行します。前の例のjava.lang.Stringコンストラクタの 呼び出しでこの機能が実際に動作していました。 場合Rhinoはまた、Java文字列へのJavaScriptのメソッドを利用できるようにjava.lang.Stringクラスはすでにそれらを他の人について

しかし、何を定義していませんか? intを期待するJavaメソッドにjavascriptのNumberを渡した場合、double(またはIntegerまたはDouble)は変換されますか? long/Longについてはどうですか? (これはDoubleに収まらないので、JSの数に収まらないだろう?

何これらの値を返すJavaメソッドについては?

を次にBoolean/booleanがあります。JSはtrueと変換falseを定数であります少なくとも一部の人々はそれがないと思うようにして、適切なJava値から?私は、JSから使用

java.lang.Boolean.TRUE.booleanValue() 

のようなコードを見てきました。

を私は肝炎eはMozilla Rhinoのドキュメントを見ましたが、私が何か明白なことを見逃してしまった場合は指摘します。

+0

私は* * JavascriptをJavaバイトコードにサイを使用してコンパイルするためにJavaから 'boolean'を渡すとしててります私が知る限り、Javascriptでもブール値として扱われます。しかし、それはちょうど 'ブール'です。 – KajMagnus

答えて

5

JavaScriptタイプをJavaタイプ(http://www-archive.mozilla.org/js/liveconnect/lc3_method_overloading.html#InvocationConversion)に変換する方法は次のとおりです。

はそれを試してみてください。

$ java -cp js.jar org.mozilla.javascript.tools.shell.Main 

js> new java.lang.Integer(12345) 
12345 
js> new java.lang.Integer(12345) == 12345 
true 

js> new java.lang.Double(12345.12345) 
12345.12345 

js> new java.lang.Long(9223372036854775807)     
js: Cannot convert 9223372036854776000 to java.lang.Long 
js> 9223372036854775807 
9223372036854776000 
js> new java.lang.Long("9223372036854775807") 
9223372036854775807 
js> new java.lang.Long("-9223372036854775808") 
-9223372036854775808 

js> new java.lang.Boolean(true) 
true 
js> new java.lang.Boolean(true) == true 
true 
js> new java.lang.Boolean(true) == false 
false 
js> java.lang.Boolean.TRUE.booleanValue() == true 
true 
js> java.lang.Boolean.FALSE.booleanValue() == false 
true 

UPD

残念ながら、私はどちらかのJavaScript-からJavaの型マッピングについてのドキュメントを見つけることができません。しかしtutorialはJavaScriptオブジェクトを挿入し、実際Double S、Boolean S、Function SできるJava Object sとコンテキストから取得されることを示している(JavaScript関数のために、またScriptable実装)(オブジェクトの場合)またはScriptable秒。それはJavaScriptにJavaの型マッピングの参照を取得する可能性がありますthis code snippetを使用して

:LiveConnectの互換性については

https://gist.github.com/1089320#file_java_script_java_type_mapping.textile

。あなたはこの脚注を参照している場合:

のJavaScriptからJavaを呼び出す機能を最初のLiveConnectと呼ばれるNetscapeブラウザ技術の 一部として実装されました。ただし、その技術はブラウザ プラグインとの通信も含んでおり、RhinoのJavaからJavaScriptを呼び出す方法はまったく異なるので、この用語は本書では使用されないため、 です。

JavaからのJavaScriptの使用については、LiveConnectの仕様とは異なると思います。 JavaScriptからのJavaの使用は同じでなければなりません。

+0

ありがとうございます。それは便利です。しかし、私はあなたのトランスクリプトを見逃していない限り、JavascriptがJavascriptの値を渡した場合にJavaメソッドがどのように見えるかという点で、JavascriptがJavaの型をどのように処理しているかについての詳細です。 –

+0

また、そのサイトの他のLiveConnectの「Rhinoとの互換性」についてのコメントもありますので、Rhinoに完全には記載されていない可能性があります。 LC3コンバージョン(そこに記載されている)とRhinoのコンバージョンがどのように関連しているかご存じですか?彼らは同一であることが知られていますか? –

+0

@Paulアップデートをご覧ください。 – pingw33n

2

は、実際に私は自分自身を変換終わる、でも「自動」の変換に問題があった:

function javaToJavaScript(str) 
{ 
    len = str.length(); 
    tmp = ""; 
    for (var i=0; i<len; i++) 
     tmp += String.fromCharCode(str.charAt(i)); 
    return tmp; 
} 
+0

StringとStringの間に問題はありませんでした。あなたが経験した問題は何でしたか? –

+0

JavaScriptから呼び出されたJava関数がJava文字列を返しました。私は思ったように、 'str.length'が期待どおりに機能していない(整数ではなく、関数を返す)のはなぜかと思った。 – lama12345

+0

私の場合、署名の置換はあまりにも異なっていました。 –

関連する問題