2016-02-24 4 views
22

में कनवर्ट करने की आवश्यकता क्यों है जब मैं TreeMap का उपयोग करता हूं तो मुझे एक समस्या आई।इंटीजर से int

Map<Integer, Integer> a = new TreeMap<Integer, Integer>(); 
    a.put(5,1); 
    a.put(3,2); 
    a.put(4,3); 
    int target = 7; 
    System.out.println(target - a.get(5)); //line 6 
    for(Map.Entry b : a.entrySet()){ 
     System.out.println(target - b.getValue()); //line 8 
    } 

उपरोक्त कोड ने मुझे एक संकलन त्रुटि दी। हालांकि, जब मैं लाइन 8 को इस पर बदलता हूं:

Map<Integer, Integer> a = new TreeMap<Integer, Integer>(); 
    a.put(5,1); 
    a.put(3,2); 
    a.put(4,3); 
    int target = 7; 
    System.out.println(target - a.get(5)); //line 6 
    for(Map.Entry b : a.entrySet()){ 
     System.out.println(target - (int) b.getValue()); //line 8 
    } 

फिर यह काम करता है। क्या कोई मुझे कुछ विचार दे सकता है क्यों मुझे लाइन 6 में किसी भी बदलाव की आवश्यकता नहीं है, लेकिन लाइन 8 में इंटीजर को int में बदलने की आवश्यकता है?

उत्तर

43

आपने for कथन में "कच्चे प्रकार" चेतावनी को अनदेखा किया। यह होना चाहिए:

for(Map.Entry<Integer,Integer> b : a.entrySet()) { 
     ... 

कच्चे प्रकार getValue() कारण होगा Object वापस जाने के लिए। यदि आप टाइप पैरामीटर प्रदान करते हैं तो संकलक जानता है कि यह Integer लौटाएगा, और यह स्वचालित रूप से अनबॉक्स हो जाएगा।

+0

ओह !!! बहुत बहुत धन्यवाद! – youngyjd

+1

क्या आपको वहां टाइप को परिभाषित करने की आवश्यकता है या हीरा ऑपरेटर (Map.Entry <>) पर्याप्त होगा (जिसे जावा 7 के साथ पेश किया गया था) as.entrySet() पहले से ही प्रकार को परिभाषित करता है? ओपी में बिल्कुल कुछ भी नहीं उपयोग करने से त्रुटि का कारण बनता है। – Thomas

+2

@ थॉमस - आपको इस प्रकार को परिभाषित करने की आवश्यकता है। केवल हीरा ऑपरेटर का उपयोग करने से आपको संकलन-समय त्रुटि मिल जाएगी। –

5

(int) b.getValue() के नीचे एक से अधिक संचालन हैं। पहले getValue()Object लौटाता है और फिर इसे Integer पर डाला जाता है जिसे तब int पर अनबॉक्स किया जाता है। a.get() अपने आप में तुरंत Integer लौटाता है क्योंकि आपने < में इंटीजर के साथ घोषित किया है> (https://docs.oracle.com/javase/7/docs/api/java/util/Map.html#get(java.lang.Object) देखें यह वी प्रकार देता है)।

target - b.getValue() संकलित नहीं किया गया क्योंकि यह int - Object ऑपरेशन था जिसे ऑपरेटर - के लिए परिभाषित नहीं किया गया था। यही कारण है कि आपको (int) पर कास्ट करना होगा।

बी काम करने के बाद भी बीपर ऑब्जेक्ट का जिक्र कर रहा है।

Integer a = 1; 
Object b = a; 
System.out.println(3 - b); // compile time error "bad operand types for binary operator '-'" 

के बाद काम करता है

Integer a = 1; 
Object b = a; 
System.out.println(3 - a); 

भी काम करता है

Integer a = 1; 
Object b = a; 
System.out.println(3 - (int) b); //this is when you say to compiler not to worry since you are sure that object reference refers to the object that is Integer. 

यदि हालांकि पर क्रम ख int का उल्लेख नहीं करता डाली असफल हो जायेगी। भले ही यह पहली जगह संकलित हो।

Integer a = 1; 
String s = "shouldn't work at runtime"; 
Object b = s; 
System.out.println(3 - (int) b); //this will compile but fail at runtime 
संबंधित मुद्दे