我想在clojure中定义一个java接口 - (以及实现它) - 我理解可以通过代理和gen-class完成实现,但是总是假定接口已经定义了。
答案 0 :(得分:5)
您可以使用clojure.core/definterface
和clojure.core/gen-interface
生成Java界面。 (definterface
扩展为对gen-interface
的调用。)
(ns demo.api)
(definterface Store
(^demo.api.Store buy [])
(^demo.api.Store buy [^int q])
(^demo.api.Store sell [])
(^int getQty []))
;; or
(gen-interface
:name demo.api.Store
:methods [[buy [] demo.api.Store]
[buy [int] demo.api.Store]
[sell [] demo.api.Store]
[getQty [] int]])
从此blog post 中抽样。
如果你想要一个“接口”,在一般意义上,那么看看Clojure Protocols。
答案 1 :(得分:0)
是的,可以使用definterface
:
(definterface MyInterface
(^int method1 [x])
(^Bar method2 [^Baz b ^Quux q]))
尽管与上面链接的某些示例不同,您现在可以在Clojure中键入提示^ints
,^doubles
等。
但是请注意,目前无法docstring
definterface
。
不过,除非您需要Java兼容性,否则应研究clojure protocols
如果这是要向Java公开Clojure代码,那么似乎最好的方法是用Java编写接口,并在Clojure中实现它,如https://github.com/puredanger/clojure-from-java所示。