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
我尝试制作Proc
和lambda
,但这些都不起作用。我可以向Parent(在Java中)添加一个强制自动转换的方法
protected MyInterface passThrough(MyInterface mi) { return mi; }
然后这可行:
def getIt
passThrough {|thing|
puts thing.inspect
}
end
但这看起来真的很酷。这只是对JRuby如何工作的疏忽,还是我错过了一些替代解决方案?
答案 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
超级复杂但它有点使用匿名闭包来实现接口:)