我已经阅读了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]
] ))
答案 0 :(得分:1)
我使用了合适的界面:IPersistentMap
,IPersistentVector
,ISeq
等等。查看源代码(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.Callable
和java.lang.Runnable