2014-01-11 32 views
2

我正在編寫一個Java類(它是一個GUI小部件),它將從Clojure中使用。當Java類被初始化時,它必須被提供一個回調函數。當滿足某些條件時,Java類將使用一個參數調用該函數。適用於需要參數的Clojure函數的Java類型?

我想弄清楚回調函數應該在Java代碼中聲明的類型。

我知道Clojure函數實現RunnableCallable,但Runnables和Callables都不能在調用時接受參數。當然,Clojure函數也實現了IFn,但我更喜歡使用標準的Java類型。有任何想法嗎?

回答

2

我檢查由Clojure的功能實現的所有接口的使用:

(ancestors (class (fn [a] a))) 

,並得到了答案:

#{clojure.lang.AFunction java.lang.Object clojure.lang.Fn clojure.lang.IFn clojure.lang.IObj java.io.Serializable java.util.concurrent.Callable java.lang.Runnable java.util.Comparator clojure.lang.AFn clojure.lang.IMeta} 

討厭鬼!看起來我不會比使用IFn做得更好。

認爲經過近20年的歷史,Java平臺沒有標準的類或接口來處理類lambda對象,這很奇怪!有ActionListeners和這個聽衆和聽衆,RunnableCallable,但沒有通用的「功能」對象。

+0

「奇怪的是,經過近20年的歷史,Java平臺沒有標準的類或者lambda類對象的接口!」那麼,它很快就會擁有:) JDK8包含一系列功能接口,包括'Function '和'Consumer '。不知道Clojure是否會利用它... –

+0

太棒了,我期待在混合Clojure/Java時使用它們。我能爲Clojure傢伙想到的唯一原因*不是利用這些優勢,而是保持與舊JRE的兼容性。 –

相關問題