为什么(int 10)生成一个Long实例?

时间:2012-02-26 21:54:08

标签: clojure type-coercion clojure-java-interop

为什么(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

2 个答案:

答案 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)框添加到LongDouble。如果您需要Integer,则必须创建一个。

user=> (type (Integer/valueOf 10))
java.lang.Integer