为什么(int 10)
不会生成java.lang.Integer
类型的实例?
; why Long here?
=> (type (int 10))
; java.lang.Long
; this one is also Long, why not java.lang.Number?
=> (type (num 10))
; java.lang.Long
=> (type (double 10))
; java.lang.Double
=> (type (long 10))
; java.lang.Long
=> (type (float 10))
; java.lang.Float
=> (type (short 10))
; java.lang.Short
=> (type (bigint 10))
; clojure.lang.BigInt
=> (type (bigdec 10))
; java.math.BigDecimal
=> (type (boolean 10))
; java.lang.Boolean
=> (type (char 10))
; java.lang.Character
=> (type (byte 10))
; java.lang.Byte
答案 0 :(得分:17)
Clojure仅在内部处理long
个整数。 (int)
用于将long
强制转换为int
,以调用期望int
参数的Java方法。
在这种情况下,(int 10)
确实会返回Java int
,但Clojure会将int
提升回long
。 (type)
使用(class)
来查找其参数的类型(在本例中),因此long
会被装入java.lang.Long
。
您可以使用java.lang.Integer
构造函数或工厂方法之一生成java.lang.Integer
:
user> (type (Integer. 10))
java.lang.Integer
user> (type (Integer/valueOf 10))
java.lang.Integer
user> (type (Integer/decode "10"))
java.lang.Integer
...
(num)
会将其参数转换为抽象类java.lang.Number
,但(type)
将返回其参数的实际类型,即java.lang.Long
。
答案 1 :(得分:7)
int
是用于互操作调用的转换为原始整数。由于每个类型调用都需要Object
个内容,然后再将Clojure(> = 1.3)框添加到Long
和Double
。如果您需要Integer
,则必须创建一个。
user=> (type (Integer/valueOf 10))
java.lang.Integer