2012-02-26 8 views
12

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

; 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 
+0

Это было исправлено в Clojure 1.5: http://dev.clojure.org/jira/browse/CLJ-820 Я тестировал его в Clojure 1.6 и (type (int 10)) дает java.lang.Integer. –

ответ

16

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

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

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

Так почему же '(.compareTo (Integer. 10) (int 10))' result 'ClassCastException java.lang.Long нельзя отнести к java.lang.Integer'? Это не пример взаимодействия Java? –

+0

'.compareTo' принимает' Object', поэтому результат '(int 10)' сразу же помещается в конец 'Long', что приводит к исключению внутри' compareTo', когда он пытается передать 'Integer'. Это хорошее взаимодействие между боксом Clojure и тем фактом, что дженерики, такие как 'java.lang.Comparable' в Java, не воссоединяются. –

+0

@DaveRay Согласно http://docs.oracle.com/javase/6/docs/api/java/lang/Integer.html 'compareTo' принимает' Integer', который выводится из 'Object'. Правильно ли утверждать, что '(int)' следует использовать только тогда, когда требуется экземпляр 'int', он не работает, когда нужен экземпляр Integer. –

 Смежные вопросы

  • Нет связанных вопросов^_^