我希望根据clojure中的类型获取对象的“默认值”。例如,它可能会这样工作:
(default-value 15) ;; => 0
(default-value "hi") ;; => ""
在这两种情况下,它都采用值的类型,并返回该值类型的“空白”实例。我能想到的最好的是
(defn default-value [x] (.newInstance (.getClass x)))
但这不适用于数字:
repl=> (.newInstance (.getClass 1))
NoSuchMethodException java.lang.Long.<init>() java.lang.Class.getConstructor0 (Class.java:3082)
答案 0 :(得分:3)
看起来多方法可能很合适:
(defmulti getNominalInstance (fn [obj] (.getClass obj)))
(defmethod getNominalInstance java.lang.Long [obj] (Long. 0))
(defmethod getNominalInstance java.lang.String [obj] "")
(prn :long (getNominalInstance 5))
(prn :string (getNominalInstance "hello"))
;=> :long 0
;=> :string ""
问题是Long只有2个构造函数,它们分别采用原始long或字符串。
Long(long value) - Constructs a newly allocated Long object
that represents the specified long argument.
Long(String s) - Constructs a newly allocated Long object
that represents the long value indicated by the String parameter.
说{&#34;新的Long()&#34;这是合法的Java,这是newInstance()
的作用。因此,您必须使用defmulti
或同等程序手动执行此操作。
答案 1 :(得分:2)
并不存在&#34;默认值&#34;对于一个类型,除非您正在寻找Java默认初始化构造函数中的东西的方式,当您不提供显式值时。那只是:
如果你想要更复杂的东西(例如,string =&gt;&#34;&#34;)你将不得不自己编写,通过以某种方式将对象的类型分派到你控制的代码中。