Java 当需要接口时,我可以在JRuby中返回匿名闭包吗?
根据,我可以将一个块传递给需要接口的方法,并且该块将转换为该接口的匿名实现。很酷 然而,我有一个Java类的Ruby子类,它有一个方法,应该返回实现接口的东西Java 当需要接口时,我可以在JRuby中返回匿名闭包吗?,java,interface,jruby,Java,Interface,Jruby,根据,我可以将一个块传递给需要接口的方法,并且该块将转换为该接口的匿名实现。很酷 然而,我有一个Java类的Ruby子类,它有一个方法,应该返回实现接口的东西 // Java public abstract class Parent { public MyInterface getIt(); } 然后这就行了: def getIt passThrough {|thing| puts thing.inspect } end 不过,这似乎真的很令人讨厌。这只是JRuby工作方
// Java
public abstract class Parent {
public MyInterface getIt();
}
然后这就行了:
def getIt
passThrough {|thing|
puts thing.inspect
}
end
不过,这似乎真的很令人讨厌。这只是JRuby工作方式上的一个疏忽,还是我缺少了其他解决方案?是的-您应该能够做到这一点。。。只需在proc/lambda上使用
即可使用java
:
class Child < Parent
def getIt
lambda { |*args| puts args.inspect }.to_java(Java::MyInterface)
end
end
类子类<父类
迪夫盖蒂
lambda{|*args |将args.inspect}.放入java(java::MyInterface)
结束
结束
当然,使用代理的java方式总是“疯狂的”:
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
类子类<父类
迪夫盖蒂
loader=JRuby.runtime.JRuby_class_loader或java_class'loader
ifaces=[MyInterface.java\u class].to\u java::JavaLang::class
Java::JavaLangReflect::Proxy.newProxyInstance(加载程序,ifaces)是否
|代理,方法,args |放置“#{method}#{args.inspect}”
结束
结束
结束
uber很复杂,但它使用了一种匿名闭包来实现接口:)
class Child < Parent
def getIt
lambda { |*args| puts args.inspect }.to_java(Java::MyInterface)
end
end
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