Почему (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
Ответы
Ответ 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