2

我需要的可能解决方案:

如何为类型的集合实现多方法Map<javaType, javaType>?像这样的东西:

(defmethod multimethod Map<javaType,javaType> [map]
  {(.key (first map)) (.value (first map))}) 

我的问题的完整解释

也许上面的问题不是我需要解决我的问题的解决方案(只是我认为使用泛型的实现可以解决我的问题),所以我认为我需要提供我的问题的完整解释并询问社区我是什么需要做。

我在 Clojure 中使用 java 库。一些函数返回我想要转换为 clojure 映射的 java 类。我正在使用java.data库执行此操作。

在大多数情况下,这可以正常工作。出于某种原因,我需要为几个类实现 java.data 多方法:

;; 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 多方法。像这样的东西:

(defmethod jd/from-java Map<Currency,Balance> [instance]
  {:cur "BALANCE!!!!"}) 

以防万一,Java 库是 XChange。钱包类的问题。方法 getBalances()。

4

1 回答 1

1

正如评论中所指出的,在运行时使用“泛型类型”可能是不可行的。但是, java.data 库似乎不会递归调用实例from-java中的键和值。forMap的默认实现是 just 。也许OP面临的具体问题可以通过重新定义方法来解决。新的实现将适用于所有键和值。例如:from-javaMap(into {} instance)from-javajava.util.Mapfrom-java

(defmethod jd/from-java java.util.Map
  [m]
  (zipmap (map jd/from-java (keys m)) (map jd/from-java (vals m))))
于 2017-08-25T01:45:21.527 回答