आज, मैंने पाया कि कोई put
किसी ऑब्जेक्ट में सक्षम है जो मौजूदा Map
में है, भले ही ऑब्जेक्ट को सही प्रकार पर नहीं डाला जा सके।प्रारंभिक मानचित्र में असंगत प्रकार की वस्तुओं को रखना - अपेक्षित और कानूनी?
सबसे पहले, मुझे एक सरल उदाहरण के साथ शुरू करते हैं:
Map<Integer, String> myMap = new HashMap<>(); //plain old hashmap
myMap.put(9,"star"); //no problem
myMap.put(10, 1.2); //Incompatible type, the compiler yells
Map<Integer, Double> aMap = (Map<Integer, Double>) myMap; //Cannot cast, the compiler yells
अब तक, सब कुछ, उम्मीद है आप के रूप में नहीं एक पहले से ही निर्माण किया मानचित्र में असंगत प्रकार का ऑब्जेक्ट डाल करने के लिए सक्षम होना चाहिए। कैसे मानचित्र इस लक्ष्य को हासिल करता है, और इस व्यवहार JLS या एपीआई में निर्दिष्ट है और इस प्रकार पर निर्भर जा सकता है -
public class NoRulesForMe {
static Object theRing;
public static void main(String[] args){
Map<Integer, String> myMap = new HashMap<>();
myMap.put(9,"star");
Map<Integer, Double> myMapMorphed = castWildly(myMap);
myMapMorphed.put(99, 3.14);
System.out.println(myMapMorphed.get(9)); //"star", as we put in
System.out.println(myMapMorphed.get(99)); //3.14, as we put in
}
public static <T> T castWildly(Object value){
theRing = value;
T morphed = (T) theRing;
return morphed;
}
}
मुझे आश्चर्य है कि यह एक रन-टाइम त्रुटि का कारण नहीं कर रहा हूँ: अब चलो इस पर विचार करते हैं ?
कारण मैं पूछता हूं कि मैंने उत्पादन कोड में इसका एक (अधिक शामिल) संस्करण देखा है, और मुझे आश्चर्य है, भले ही यह परेशान और सुगंधित हो, भले ही यह कार्यशीलता के अनुसार काम करने की गारंटी दी जा सके। किसी भी इनपुट की सराहना की जाएगी।
आपको "टाइप एरर" Google की आवश्यकता है। –
जेनिक्स के जावा के कार्यान्वयन में यह _inherent_ है। –
@LouisWasserman क्या आप जावा के जेनेरिक में * क्या * अंतर्निहित हैं? मुझे आश्चर्य नहीं है कि संकलक शिकायत नहीं करता था। लेकिन बड़ा सवाल, मुझे लगता है, जावा कैसे 'डबल' को 'स्ट्रिंग' के रूप में संग्रहीत किया जा सकता है। – flow2k