当预期接口时,我可以在JRuby中返回匿名闭包吗?

时间:2013-08-28 14:30:27

标签: java interface jruby

Per the 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,但这些都不起作用。我可以向Parent(在Java中)添加一个强制自动转换的方法

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

然后这可行:

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

但这看起来真的很酷。这只是对JRuby如何工作的疏忽,还是我错过了一些替代解决方案?

2 个答案:

答案 0 :(得分:2)

是的 - 您应该能够做到这一点......只需在proc / lambda上使用to_java

class Child < Parent
  def getIt
    lambda { |*args| puts args.inspect }.to_java(Java::MyInterface)
  end
end

答案 1 :(得分:0)

当然,总是疯狂的&#34; java-way Proxy

class Child < Parent
  def getIt
    loader = JRuby.runtime.jruby_class_loader # or java_class' loader
    ifaces = [ MyInterface.java_class ].to_java Java::JavaLang::Class
    Java::JavaLangReflect::Proxy.newProxyInstance(loader, ifaces) do 
      |proxy, method, args| puts "#{method} #{args.inspect}"
    end
  end
end

超级复杂但它有点使用匿名闭包来实现接口:)