2013-08-28 25 views
0

根據the docs,我可以將一個塊傳遞給期望接口的方法,並且該塊將轉換爲該接口的匿名實現。它太酷了!當預期接口時,我可以在JRuby中返回匿名閉包嗎?

但是,我有一個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,但是沒有那些工作。我可以添加強制自動轉換

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

的方法,母公司(在Java中),然後這個作品:

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

這似乎真的哈克不過。這僅僅是JRuby工作方式的疏忽,還是我錯過了一些備用解決方案?

回答

2

是 - 你應該能夠做到這一點......只是使用to_java在PROC /λ:

class Child < Parent 
    def getIt 
    lambda { |*args| puts args.inspect }.to_java(Java::MyInterface) 
    end 
end 
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 

超複雜但它使用一個匿名封閉來實現接口:)

相關問題