Почему (int 10) производит Long экземпляр? - PullRequest
13 голосов
/ 27 февраля 2012

Почему (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 ]

17 голосов
/ 27 февраля 2012

Clojure имеет дело только с long целыми числами внутри.(int) используется для приведения long к int для вызова методов Java, которые ожидают аргумент int.

В этом случае (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 снова.

7 голосов
/ 27 февраля 2012

int - приведение к примитивному целому числу для вызовов взаимодействия. Так как каждый из вызовов типа занимает Object, вещи снова упаковываются, а Clojure (> = 1.3) получает значения Long и Double. Если вам нужен Integer, вам нужно его создать.

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