Dictionary 如何区分java映射和clojure映射?

Dictionary 如何区分java映射和clojure映射?,dictionary,clojure,clojure-java-interop,Dictionary,Clojure,Clojure Java Interop,假设我有以下代码: (def m1 (java.util.HashMap.)) (def m2 (java.util.LinkedHashMap.)) (def m3 {}) 我需要一个能够检测来自java的映射的函数,例如: (map java-map? [m1 m2 m3]) ;; => (true true false) 有什么现成的吗?您可以用它来检查是否有东西实现了IPersistentMap,这对于Clojure映射是正确的,但对于java.utils.*映射: (map?

假设我有以下代码:

(def m1 (java.util.HashMap.))
(def m2 (java.util.LinkedHashMap.))
(def m3 {})
我需要一个能够检测来自java的映射的函数,例如:

(map java-map? [m1 m2 m3]) ;; => (true true false)
有什么现成的吗?

您可以用它来检查是否有东西实现了
IPersistentMap
,这对于Clojure映射是正确的,但对于
java.utils.*
映射:

(map? (java.util.HashMap.)) ;; => false
(map? (java.util.LinkedHashMap.)) ;; => false
(map? {}) ;; => true
更准确地说,您应该检查给定对象是否满足某些要求(例如,是持久的、不可变的/可变的-
map?
将回答该特定问题)。没有简单的方法可以判断您是否获得了映射的Java实现,因为您可以从外部库获得任何其他实现,这些实现可能具有
Java.util.map
的自定义实现,或者从
Java.util
包扩展一个具体实现。

我会这样做:

user=> (defn java-map? [m] 
         (and (instance? java.util.Map m) 
              (not (map? m))))
#'user/java-map?

user=> (java-map? {})
false

user=> (java-map? (java.util.HashMap.))
true

user=> (java-map? [])
false

因此,您只需检查它是否实现了核心java的
映射
接口,但不是clojure的持久映射。

您是否尝试过使用
类型
?是的,实际上正在考虑使用
映射
,但是
(定义java映射?(补码映射?)
-这将在其他类型的对象上给出不正确的结果:
(java map?[]);=>真的
是的,你是对的,让我删除这部分答案,因为它是不正确的。我相信,在那里你也可以使用
协议
多方法
按输入类型发送这对我来说似乎是合法的。