Java泛型

时间:2017-08-24 14:19:18

标签: java generics clojure dispatch multimethod

我需要的可能解决方案:

如何为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()。

1 个答案:

答案 0 :(得分:1)

如评论中所述,在运行时使用“泛型类型”可能不是首发。但是,it appears表示java.data库不会对from-java实例中的键和值进行递归调用Mapfrom-java Map的默认实施仅为(into {} instance)。也许OP面临的具体问题可以通过重新定义from-java的{​​{1}}方法来解决。新实现将java.util.Map应用于所有键和值。例如:

from-java