适用于需要参数的Clojure函数的Java类型?
问题描述:
我正在编写一个Java类(它是一个GUI小部件),它将从Clojure中使用。当Java类被初始化时,它必须被提供一个回调函数。当满足某些条件时,Java类将使用一个参数调用该函数。适用于需要参数的Clojure函数的Java类型?
我想弄清楚回调函数应该在Java代码中声明的类型。
我知道Clojure函数实现Runnable
和Callable
,但Runnables和Callables都不能在调用时接受参数。当然,Clojure函数也实现了IFn
,但我更喜欢使用标准的Java类型。有任何想法吗?
答
我检查由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
和这个听众和听众,Runnable
和Callable
,但没有通用的“功能”对象。
“奇怪的是,经过近20年的历史,Java平台没有标准的类或者lambda类对象的接口!”那么,它很快就会拥有:) JDK8包含一系列功能接口,包括'Function'和'Consumer '。不知道Clojure是否会利用它... –
太棒了,我期待在混合Clojure/Java时使用它们。我能为Clojure家伙想到的唯一原因*不是利用这些优势,而是保持与旧JRE的兼容性。 –