0

docsに従ってインターフェイスを期待するメソッドにブロックを渡すことができ、ブロックはそのインターフェイスの匿名実装に変換されます。超カッコイイ!

ただし、Java クラスの Ruby サブクラスがあり、インターフェイスを実装する何かを返すメソッドがあります。

// Java
public abstract class Parent {
  public MyInterface getIt();
}
# Ruby
class Child < Parent
  def getIt
    # Need to return an implementation of MyInterface?
  end
end

と を作成しようとしましたProclambda、どちらも機能しません。自動変換を強制するメソッドを(Javaで)Parentに追加できます

protected MyInterface passThrough(MyInterface mi) { return mi; }

そして、これは機能します:

def getIt
  passThrough {|thing|
    puts thing.inspect
  }
end

ただし、これは本当にハッキーに思えます。これは JRuby の仕組みの単なる見落としですか、それとも別の解決策がありませんか?

4

2 に答える 2

2

はい-それを行うことができるはずです... to_javaproc/lambda で使用するだけです:

class Child < Parent
  def getIt
    lambda { |*args| puts args.inspect }.to_java(Java::MyInterface)
  end
end
于 2013-08-31T14:04:32.087 に答える