首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在clojure中获取对象类型的“默认值”?

在clojure中获取对象类型的“默认值”?
EN

Stack Overflow用户
提问于 2017-03-08 11:07:11
回答 2查看 97关注 0票数 0

我想根据clojure中的类型获取对象的“默认值”。例如,它可能是这样工作的:

代码语言:javascript
复制
(default-value 15) ;; => 0
(default-value "hi") ;; => ""

在这两种情况下,它都会获取该值的类型,并返回该值类型的一个“空”实例。我能想到的最好的办法就是

代码语言:javascript
复制
(defn default-value [x] (.newInstance (.getClass x)))

但这并不适用于数字:

代码语言:javascript
复制
repl=> (.newInstance (.getClass 1))

NoSuchMethodException java.lang.Long.<init>()  java.lang.Class.getConstructor0 (Class.java:3082)
EN

回答 2

Stack Overflow用户

发布于 2017-03-08 13:19:57

看起来多方法可能是一个很好的选择:

代码语言:javascript
复制
(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。

代码语言:javascript
复制
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或类似的工具手动完成此操作。

票数 4
EN

Stack Overflow用户

发布于 2017-03-08 13:19:44

对于类型来说,实际上并没有所谓的“默认值”,除非您正在寻找Java在未提供显式值的情况下在构造函数中默认初始化内容的方式。那只是:

  • boolean=>false
  • number=>0
  • object=>null

如果你想要更复杂的东西(例如,string=>""),你将不得不自己编写,通过以某种方式将对象的类型分派到你控制的代码中。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42662233

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档