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

यह क्लोजर 1.5 में तय किया गया था: http://dev.clojure.org/jira/browse/CLJ-820 मैंने क्लोजर 1.6 में इसका परीक्षण किया और (प्रकार (int 10)) java.lang.Integer देता है। –

उत्तर

16

क्लोजर केवल long आंतरिक रूप से पूर्णांक के साथ सौदा करता है। (int)int तर्क की अपेक्षा रखने वाले जावा विधियों को कॉल करने के लिए long को int पर डालने के लिए उपयोग किया जाता है।

इस मामले (int 10) में वास्तव में एक जावा 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 करने के लिए अपने तर्क Upcast जाएगा, लेकिन (type) वास्तविक प्रकार वापस आ जाएगी अपने तर्क का, यानी java.lang.Long फिर।

7

int इंटरॉप कॉल के लिए आदिम पूर्णांक के लिए एक कलाकार हैं। चूंकि प्रत्येक प्रकार की कॉल Object चीजें फिर से बॉक्स की जाती हैं और क्लोजर (> = 1.3) बॉक्स Long और Double पर ले जाती हैं। अगर आपको Integer की आवश्यकता है तो आपको एक बनाना होगा।

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

तो '(.compareTo (Integer। 10) (int 10)) 'परिणाम' क्लासकास्ट अपवाद java.lang.Long में java.lang.Integer' पर नहीं डाला जा सकता है? क्या यह जावा इंटरऑप का उदाहरण नहीं है? –

+0

'.compareTo 'ऑब्जेक्ट' लेता है, इसलिए '(int 10)' का परिणाम तुरंत 'लांग' पर वापस लाया जाता है जिसके परिणामस्वरूप 'तुलना करने के लिए' अपवाद होता है जब यह 'इंटीजर' पर डालने का प्रयास करता है। क्लोजर के मुक्केबाजी के बीच यह एक अच्छी बातचीत है और तथ्य यह है कि जावा में 'java.lang.Comparable' जैसे जेनेरिक को संशोधित नहीं किया जाता है। –

+0

@ डेवरे http://docs.oracle.com/javase/6/docs/api/java/lang/Integer.html 'तुलना करने के लिए' एक 'इंटेगर' लेता है, जो 'ऑब्जेक्ट' से प्राप्त होता है। क्या यह कहना सही है कि 'int (') का उपयोग केवल तभी किया जाना चाहिए जब' int 'आवृत्ति की आवश्यकता हो, यह तब काम नहीं करता जब' इंटेगर 'आवृत्ति की आवश्यकता होती है। –