如何为Map<javaType, javaType>
类型的集合实现多方法?像这样:
(defmethod multimethod Map<javaType,javaType> [map]
{(.key (first map)) (.value (first map))})
也许上面的问题不是我解决问题所需的解决方案(我只是认为使用泛型的实现可以解决我的问题),所以我想我需要提供完整的解释我的问题是什么,并询问社区我需要做什么。
我在Clojure中使用java库。一些函数返回我想要转换为clojure贴图的java类。我正在使用java.data库。
在大多数情况下,这样做很好。出于某种原因,我需要为几个类实现java.data multimethod:
;; From java.data readme
(defmethod from-java YourJavaClass [instance]
; your custom logic for turing this instance into a clojure data structure)
但是没关系,这很好用:
(defmethod jd/from-java CurrencyPair [instance]
(help/convert-market-keyword (.toString instance)))
但是我遇到了一些无法映射的课程。出于某种原因。
(defmethod jd/from-java AccountInfo [instance]
{:myWallet (jd/from-java (.getWallet instance))})
(defmethod jd/from-java Wallet [instance]
{:myBalances (jd/from-java (.getBalances instance))})
(defmethod jd/from-java Balance [instance]
"BALANCE!!!!")
(defmethod jd/from-java Currency [instance]
;; e.g. converts Currency instance with field "BTC" to keyword :btc
(help/convert-currency-keyword (.toString instance)))
映射AccountInfo
实例后,我希望看到这个:
{:myWallet
{:myBalances
{:btc "BALANCE!!!!"
:eth "BALANCE!!!!"
:usdt "BALANCE!!!!"
...}
但请看:
{:myWallet
{:myBalances
{#object[org.knowm.xchange.currency.Currency 0x4faae851 "BTC"]
#object[org.knowm.xchange.dto.account.Balance 0x42942aa9 "Balance [currency=GNT, total=null, available=0E-8, frozen=0E-8, borrowed=0, loaned=0, withdrawing=0, depositing=0]"],
#object[org.knowm.xchange.currency.Currency 0x299d00e0 "ETH"]
#object[org.knowm.xchange.dto.account.Balance 0x23f7cb1d "Balance [currency=LSK, total=null, available=0E-8, frozen=0E-8, borrowed=0, loaned=0, withdrawing=0, depositing=0]"],
...}
.getBalances()
的返回值类型为Map<Currency,Balance>
,似乎java.data不知道如何使用地图。
所以,我的问题(目前)是如何为这种集合实现java.data multimethod。像这样:
(defmethod jd/from-java Map<Currency,Balance> [instance]
{:cur "BALANCE!!!!"})
以防万一,java库是XChange。 Wallet类的问题。方法getBalances()。
答案 0 :(得分:1)
如评论中所述,在运行时使用“泛型类型”可能不是首发。但是,it appears表示java.data库不会对from-java
实例中的键和值进行递归调用Map
。 from-java
Map
的默认实施仅为(into {} instance)
。也许OP面临的具体问题可以通过重新定义from-java
的{{1}}方法来解决。新实现将java.util.Map
应用于所有键和值。例如:
from-java