0

根据文档,我可以将一个块传递给一个需要接口的方法,该块将被转换为该接口的匿名实现。它太酷了!

但是,我有一个 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

我曾尝试制作 aProc和 a lambda,但这些都不起作用。我可以向父级(在 Java 中)添加一个强制自动转换的方法

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

然后这个工作:

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

不过,这似乎真的很hacky。这只是对 JRuby 工作方式的疏忽,还是我错过了一些替代解决方案?

4

2 回答 2

2

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

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

当然,总是有“疯狂”的java方式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

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

于 2013-08-31T14:41:53.417 回答