Clojure技术疑问:为何可将(Integer/MAX_VALUE)当作函数调用?
为什么Clojure中(Integer/MAX_VALUE)及多层括号包裹能正常运行,而(1)报错?
核心原因在于两种值的类型是否实现了clojure.lang.IFn接口——Clojure的括号本质是调用函数/可调用对象,只有实现了IFn的对象才能被括号调用。
关于
Integer/MAX_VALUE:
它的数值是2147483647,在Clojure中会被自动转为clojure.lang.BigInt类型(Clojure默认用BigInt处理整数,避免溢出问题)。而BigInt类特意实现了IFn接口,当你用括号调用它(不管套多少层),它的逻辑就是直接返回自身,所以不会报错,结果始终是这个常量值。关于
1:
在Clojure中,小整数默认是java.lang.Long类型(Java原生包装类),这个类并没有实现IFn接口。当你写(1)时,Clojure会尝试把Long实例转换成可调用的IFn对象,这就触发了类型转换异常,也就是你看到的报错。
可以用以下代码验证这个逻辑:
; 查看Integer/MAX_VALUE的类型 (type Integer/MAX_VALUE) => clojure.lang.BigInt ; 查看1的类型 (type 1) => java.lang.Long ; 多层调用BigInt,结果和原常量一致 (= ((Integer/MAX_VALUE)) Integer/MAX_VALUE) => true
内容的提问来源于stack exchange,提问作者Viktor Holmberg
相关产品推荐
相关产品推荐

