Rhino1.7R3(Java1.7付属のRhinoも含む)までは発生しない。 Rhino1.7R4でInterfaceAdapter.javaの実装が以下のように変更されたことが原因。
- 変更前: スクリプトで実装しようとしているJavaインターフェースが複数のメソッドを持つ場合、 引数の数とデータ型が全て一致していればOK(例えば、WindowListenerやKeyListenerのようなGUIイベントリスナ)
- 変更後: スクリプトで実装しようとしているJavaインターフェースが複数のメソッドを持つ場合、 許されるのはオーバーロードだけ(名前が同じで引数の数とデータ型だけが異なるメソッド)
>java -classpath .;js.jar org.mozilla.javascript.tools.shell.Main -w -debug SwingApplication.jsjs: "SwingApplication.js", line 69: Cannot convert function to interface java.awt.event.WindowListener since it contains methods with different names at SwingApplication.js:69b-1. 問題の実装方法を中心に記述したスクリプト(event-listener.js):
var gui = new java.awt.Frame("event-listener");gui.addWindowListener( function(event, methodName) { if (methodName === "windowClosing") { event.getWindow().setVisible(false); } });gui.setSize(200, 100);gui.setVisible(true);java.lang.Thread.currentThread().sleep(1000);gui.dispose();java.lang.System.out.println("ok");b-2. Rhino1.7R4で実行する:
>java -classpath .;js.jar org.mozilla.javascript.tools.shell.Main -w -debug event-listener.jsjs: "event-listener.js", line 3: Cannot convert function to interface java.awt.event.WindowListener since it contains methods with different names at event-listener.js:3b-3. jrunscript(Java1.7、Rhino1.7R3 PRERELEASE相当)で実行する:
>jrunscript event-listener.jsok上記の動作が開発側の意図したものかどうか、New in Rhino 1.7R4に説明されていないので判断できない。
エラーの回避策としては、Rhino1.7R3を使い続けるのが簡単だが、 書き直すことが手間でないと感じるなら Implementing Java Interfaces で説明されているやり方に変更する方法も一応ある。
c-1. Javaインターフェースの全てのメソッドをスクリプトで実装する例:
var listener = new java.awt.event.WindowListener({ windowClosing: function(event) { event.getWindow().dispose(); }, windowClosed: function(event) { }, windowIconified: function(event) { }, windowOpened: function(event) { java.lang.System.out.println("opened"); }, windowDeiconified: function(event) { }, windowActivated: function(event) { java.lang.System.out.println("activated"); }, windowDeactivated: function(event) { }});
0 件のコメント:
コメントを投稿