我可以在Clojure中定义一个java接口吗?

时间:2013-09-21 19:22:51

标签: clojure

我想在clojure中定义一个java接口 - (以及实现它) - 我理解可以通过代理和gen-class完成实现,但是总是假定接口已经定义了。

2 个答案:

答案 0 :(得分:5)

您可以使用clojure.core/definterfaceclojure.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所示。