Подтвердить что ты не робот

Почему (int 10) создает длинный экземпляр?

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

Ответ 1

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 или factory:

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.

Ответ 2

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

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