从Clojure到Java返回向量,序列和映射

时间:2014-11-20 13:08:36

标签: java clojure interop

我已经阅读了Calling clojure from java的优秀答案,它展示了从Java调用Clojure的新风格。

但是给出的例子只返回一个浮点数。如何将Clojure向量和其他序列类型从Clojure返回到Java?和地图?

特别是在这个gen-class中:

(ns dummy-app.core
  (:gen-class
   :name com.example.dummy
   :methods [#^{:static true} [f [int] int]
             #^{:static true} [getVect [] XXXX]
             #^{:static true} [getMap [] YYYY]
             #^{:static true} [getSeq [] ZZZZ]
             ] ))

我应该为XXXX,YYYY和ZZZZ做些什么?它们应该在我的Java程序中使用什么类型?

更新:响应Tomo的有希望的回答,如果我尝试在gen-clas中使用IPersistentVector,我会得到

Caused by: java.lang.ClassNotFoundException: java.lang.IPersistentVector

当我尝试创造Uberjar时。我假设我需要做一些其他的事情才能导入这些类型?

更新2:好的,多亏了Tomo的更多评论,这似乎有效:

(ns dummy-app.core
  (import clojure.lang.IPersistentVector)
  (:gen-class
   :name com.example.dummy
   :methods [#^{:static true} [f [int] int]
             #^{:static true} [getVect [] clojure.lang.IPersistentVector]
             ] ))

2 个答案:

答案 0 :(得分:1)

我使用了合适的界面:IPersistentMapIPersistentVectorISeq等等。查看源代码(https://github.com/clojure/clojure/tree/master/src/jvm/clojure/lang)。

答案 1 :(得分:0)

您也可以指定适当的Java接口。

Clojure向量,列表和序列都实现了java.util.List

Clojure地图实施java.util.Map

功能同时实现java.util.concurrent.Callablejava.lang.Runnable