Create  Edit  Diff  FrontPage  Index  Search  Changes  Login

引数情報なしでオーバーロードされたメソッド(コンストラクタ)の呼び出し

以下の条件で判断する(rjb-0.1.4以降)

  • 引数の数が一致
  • 型がjava.lang.Objectであれば無条件に許容
  • FIXNUMであれば、BCDFIJSのいずれかに一致(範囲チェック無し)
  • STRINGであれば、java.lang.Stringに一致
  • TRUE/FALSEであれば、Zに一致
  • ARRAYであれば、配列であれば一致(型チェック無し)
  • Rjbの移入オブジェクトのインスタンスであれば、java.lang.Stringに一致または、移入元クラスがJava側のクラスまたはその派生クラスであれば一致。
    • Stringに一致した場合は、toStringを呼び出して文字列を与える。本来のJavaの動作とは異なるがスクリプトの簡便さからJavaの文字列連結などと同様な処置を行う。この判定はメソッドの並び順に依存し、継承の近さとは関係しないという制限を持つ。
  • それ以外でJava側がクラス型であれば一致。プリミティブ型であれば不一致。

元の論議

  • newしたときにオーバーロードされていても判断しきれていない場合がある。エラーを吐くべきだがStringとプリミティブ型は難しくない場合は自動認識して欲しい。(javax.swing.JButtonをnew("ぼたん")としたらどうもIconのインスタンスだと思われたようだ。バイト列だから?)
    • 下の例外はコンストラクタとは関係ないようですが、できれば元のスクリプトが欲しいです。って言うか、いきなりJButtonをimportしたらいきなりSEGVするなぁ(実はJavaのGUIプログラミングは苦手というか良く知らなくてIDE任せだったり)。ちなみに自動認識はある程度まではしています。最初に一致したシグネチャーを使うという方法ですが。L'eclatのほうに書いている、Win32とMacで並び順が違ってテストでエラーっていうパターンはその類。
      • rjb.c(rjb_newinstance:2071)でif ((*pc)->arg_count == argc)してて、最初に一致するコンストラクタがnew JButton(java.awt.Icon)だからエラーが出たのだと思う。引数からシグネチャを生成すればいいんだろうけどいい案は無い。以下スクリプトそのもの。サイズがおかしいが、適当にJForm::setSize()してpack()すればよい。そしてisVisible()を監視するのは邪道気味。Javaの文字列はUnicodeなのでフックしないと文字化けしちゃうなあ。うーんなんでiconv動かんのじゃ〜。
      • なんだ、ばれてますね(一致=引数の数であって型じゃない)。型見るの面倒だけど文字列くらいは見るようにしましょう。
require 'rjb'

Rjb::load

frame = Rjb::import('javax.swing.JFrame')
box_layout = Rjb::import('javax.swing.BoxLayout')
border_layout = Rjb::import('java.awt.BorderLayout')
grid_layout = Rjb::import('java.awt.GridLayout')
button = Rjb::import('javax.swing.JButton')


f = frame.new
#f.getContentPane().setLayout(grid_layout.new)
f.getContentPane().setLayout(border_layout.new)

#b = button.new_with_sig("Ljava.lang.String;", "ぼたん") #動く
b = button.new("ぼたん") #変


#f.getContentPane().add(b)
f.getContentPane()._invoke('add', 'Ljava.awt.Component;', b)

f.setVisible(true)
loop do
break unless f.isVisible()
sleep(0.1)
end
Last modified:2004/09/26 00:34:34
Keyword(s):
References:[RubyJavaブリッヂ]