Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/rest/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 当需要接口时,我可以在JRuby中返回匿名闭包吗?_Java_Interface_Jruby - Fatal编程技术网

Java 当需要接口时,我可以在JRuby中返回匿名闭包吗?

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类的Ruby子类,它有一个方法,应该返回实现接口的东西

// 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