基于java泛型的Clojure多方法调度 我需要的可能解决方案:
如何为基于java泛型的Clojure多方法调度 我需要的可能解决方案:,java,generics,clojure,dispatch,multimethod,Java,Generics,Clojure,Dispatch,Multimethod,如何为Map等类型的集合实现多重方法?大概是这样的: (defmethod多方法映射[Map] {(.key(第一个映射))(.value(第一个映射))} 我问题的全部解释 也许上面的问题不是我解决问题所需要的解决方案(只是我认为使用泛型实现可以解决我的问题),所以我认为我需要提供关于我的问题的完整解释,并询问社区我需要做什么 我在Clojure中使用java库。有些函数返回我想要转换为clojure映射的java类。我在图书馆做这件事 在大多数情况下,这很好。出于某种原因,我需要为几个类
Map
等类型的集合实现多重方法?大概是这样的:
(defmethod多方法映射[Map]
{(.key(第一个映射))(.value(第一个映射))}
我问题的全部解释 也许上面的问题不是我解决问题所需要的解决方案(只是我认为使用泛型实现可以解决我的问题),所以我认为我需要提供关于我的问题的完整解释,并询问社区我需要做什么 我在Clojure中使用java库。有些函数返回我想要转换为clojure映射的java类。我在图书馆做这件事 在大多数情况下,这很好。出于某种原因,我需要为几个类实现java.data multimethod:
;;来自java.data自述文件
(java YourJavaClass[实例]中的defmethod)
;用于将此实例转换为clojure数据结构的自定义逻辑)
但这没关系,而且效果很好:
(defmethod jd/from java CurrencyPair[实例]
(帮助/转换市场关键字(.toString实例)))
但由于某种原因,我遇到了一些无法“映射”的类
(defmethod jd/from java AccountInfo[实例]
{:myWallet(jd/fromjava(.getWallet实例))}
(defmethod jd/来自java钱包[实例]
{:myBalances(jd/from java(.getBalances实例))}
(defmethod jd/from java Balance[实例]
“平衡!!!!”)
(defmethod jd/from java Currency[实例]
;例如,将字段为“BTC”的货币实例转换为关键字:BTC
(帮助/转换货币关键字(.toString实例)))
映射AccountInfo
实例后,我希望看到以下内容:
{:myWallet
{:我的余额
{:btc“平衡!!!!”
:eth“平衡!!!!”
:usdt“余额!!!!”
...}
但请看这个:
{:myWallet
{:我的余额
{#对象[org.knowm.xchange.currency.currency 0x4faae851“BTC”]
#对象[org.knowm.xchange.dto.account.Balance 0x42942aa9“余额[货币=GNT,合计=null,可用=0E-8,冻结=0E-8,借入=0,借入=0,借入=0,取款=0,存款=0]”,
#对象[org.knowm.xchange.currency.currency 0x299d00e0“ETH”]
#对象[org.knowm.xchange.dto.account.Balance 0x23f7cb1d“余额[币种=LSK,合计=null,可用=0E-8,冻结=0E-8,借入=0,借入=0,借入=0,取款=0,存款=0]”,
...}
.getBalances()
的返回值类型是Map
,而java.data似乎不知道如何使用映射
因此,我(目前)的问题是如何为此类集合实现java.data multimethod
(defmethod jd/from java Map[实例]
{:cur“BALANCE!!!!”})
以防万一,java库是XChange。class.Method getBalances()的问题。如注释中所述,使用“泛型类型”在运行时可能不是初学者。但是,java.data库不会对
Map
实例中的键和值从java递归调用。from java
forMap
的默认实现只是(进入{}实例)
。或许可以通过重新定义java.util.Map
的from java
方法来解决OP面临的具体问题。新的实现将from java
应用于所有键和值。例如:
(defmethod jd/from-java java.util.Map
[m]
(zipmap (map jd/from-java (keys m)) (map jd/from-java (vals m))))
Java(或Clojure)中的泛型类型信息在运行时不可用,因为有一个名为“类型擦除”的过程(编译期间剥离泛型类型信息)。也许可以手动执行转换并自定义处理:balances
条目?Suure..我已经尝试实现IPersistentMap,但没有猜到java.util.Map。谢谢!