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内部的に整数のみを扱います。引数を期待するJavaメソッドを呼び出すため(int)にをにキャストするlongために使用されます。intint

この場合(int 10)、実際にはJavaが返されますintが、Clojureはそのint逆をにプロモートしlongます。は引数のタイプ(この場合)を見つけるために使用するため、(type)はボックスに入れられます。(class)longjava.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 に答える