Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
基于java泛型的Clojure多方法调度 我需要的可能解决方案:_Java_Generics_Clojure_Dispatch_Multimethod - Fatal编程技术网

基于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
for
Map
的默认实现只是
(进入{}实例)
。或许可以通过重新定义
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。谢谢!