如何区分java地图和clojure地图?

Ole*_*Cat 4 dictionary clojure clojure-java-interop

假设我有以下代码:

(def m1 (java.util.HashMap.))
(def m2 (java.util.LinkedHashMap.))
(def m3 {})
Run Code Online (Sandbox Code Playgroud)

我需要一个能够检测来自java的地图的函数,例如:

(map java-map? [m1 m2 m3]) ;; => (true true false)
Run Code Online (Sandbox Code Playgroud)

什么开箱即用?

Pio*_*dyl 8

你可以map?用来检查某些东西IPersistentMap是否适用于Clojure地图但不适用于java.utils.*地图:

(map? (java.util.HashMap.)) ;; => false
(map? (java.util.LinkedHashMap.)) ;; => false
(map? {}) ;; => true
Run Code Online (Sandbox Code Playgroud)

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