我想根据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)发布于 2017-03-08 13:19:57
看起来多方法可能是一个很好的选择:
(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或string。
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.说"new Long()“是不合法的,而newInstance()就是这么做的。因此,您必须使用defmulti或类似的工具手动完成此操作。
发布于 2017-03-08 13:19:44
对于类型来说,实际上并没有所谓的“默认值”,除非您正在寻找Java在未提供显式值的情况下在构造函数中默认初始化内容的方式。那只是:
如果你想要更复杂的东西(例如,string=>""),你将不得不自己编写,通过以某种方式将对象的类型分派到你控制的代码中。
https://stackoverflow.com/questions/42662233
复制相似问题