似乎 (?) Clojure将所有整数实例化为java.lang.Long。我最近发现我使用的一个库(该库包装了一个Java库)返回的是java.lang.Integer。这打破了我正在使用的一个多方法,该方法是按类来分发的。
我的解决办法是简单地创建一个新的defmethod来处理java.lang.Integer。它与处理java.lang.Long的defmethod完全相同。
是否有更优雅的方法?能否使defmethod处理一组分发值?Integer和Long有一个共同的祖先类java.lang.Number,但我不想使用它,因为它会捕捉浮点数,而浮点数应该被忽略。
我想我可以重写分发以检查输入类的类型是Integer还是Long,并以此分发到:int,然后以:string的形式分发java.lang.String,但这实际上可能需要更多的代码:)
当前的形式大致如此:
(defmulti int-or-nil class)
(defmethod int-or-nil java.lang.Long
[integer]
(identity integer))
(defmethod int-or-nil java.lang.Integer
[integer]
(identity integer))
(defmethod int-or-nil java.lang.String
[maybe-int-string]
(try (Integer/parseInt maybe-int-string)
(catch java.lang.NumberFormatException e)))
(defmethod int-or-nil :default
[not-int])