13

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

2 回答 2

17

Clojure 只在内部处理long整数。(int)用于将 a 强制转换为 alongint调用需要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再次。

于 2012-02-26T22:21:00.130 回答
7

int是用于互操作调用的原始整数的强制转换。由于每个类型调用都需要一个Object东西再次装箱,Clojure (>= 1.3) 将Long和装箱Double。如果你需要一个,Integer你必须创建一个。

user=> (type (Integer/valueOf 10))
java.lang.Integer
于 2012-02-26T22:15:02.063 回答