मैं समझने की कोशिश कर रहा हूं कि इस कोड में अनचेक कास्ट चेतावनी क्यों है। पहले दो डाले कोई चेतावनी है, लेकिन तीसरे करता है:जेनेरिक क्लास लागू करने के लिए अनचेक कास्ट मानचित्र <String, V>
कोप्रकार सुरक्षा:
class StringMap<V> extends HashMap<String, V> { } class StringToIntegerMap extends HashMap<String, Integer> { } Map<?, ?> map1 = new StringToIntegerMap(); if (map1 instanceof StringToIntegerMap) { StringToIntegerMap stringMap1 = (StringToIntegerMap)map1; //no unchecked cast warning } Map<String, Integer> map2 = new StringMap<>(); if (map2 instanceof StringMap) { StringMap<Integer> stringMap2 = (StringMap<Integer>)map2; //no unchecked cast warning } Map<?, Integer> map3 = new StringMap<>(); if (map3 instanceof StringMap) { StringMap<Integer> stringMap3 = (StringMap<Integer>)map3; //unchecked cast warning }
यह
stringMap3
कलाकारों के लिए पूर्ण चेतावनी है अनियंत्रितStringMap<Integer>
Map<capture#3-of ?,Integer>
से डाली
हालांकि, StringMap
वर्ग घोषणा Map
(यानी, String
) का पहला प्रकार पैरामीटर निर्दिष्ट करती है, औरदोनोंऔर StringMap<Integer>
कास्ट Map
(यानी Integer
) के दूसरे प्रकार के पैरामीटर के लिए उसी प्रकार का उपयोग करें। जो मैं समझता हूं, जब तक कि कास्ट ClassCastException
नहीं फेंकता है (और ऐसा नहीं होना चाहिए क्योंकि instanceof
चेक है), stringMap3
मान्य Map<String, Integer>
होगा।
क्या यह जावा कंपाइलर की एक सीमा है? या क्या कोई परिदृश्य है जहां कुछ तर्कों के साथ Map3 या stringMap3 के कॉलिंग विधियों का परिणाम अनपेक्षित ClassCastException
हो सकता है यदि चेतावनी को अनदेखा किया जाता है?
यह निष्कर्ष था कि मैं @ पित्ता के जवाब और जेएलएस के विभिन्न वर्गों को पढ़ने के बाद आ रहा था। मुझे लगता है कि जेएलएस को दो पैरामीटर प्रकारों के बीच बेहतर कास्टिंग नियम जोड़ने के लिए अद्यतन किया जा सकता है, जहां संबंधित जेनेरिक वर्ग अलग-अलग प्रकार के पैरामीटर का उपयोग करते हैं, लेकिन मुझे नहीं पता कि यह कितना व्यवहार्य है या साइड इफेक्ट्स। यह प्रश्न तब तक संबंधित प्रतीत होता है जब तक कि मैं गलत नहीं हूं: [जेनेरिक वर्ग के जेनेरिक उपप्रकारों को कास्ट करना] (// stackoverflow.com/questions/17883536/casting-to-generic-subtypes-of-a-generic-class) । – blurredd