2017-04-15 6 views
7

में कोड टाइप करें और ग्रहण 4.5.0 & जावैक (1.8) में आउटपुट के नीचे विचार करें।जावा कैसे निर्धारित करता है कि टाइप एरर प्रक्रिया

मैं इसे क्रम में प्रकार विलोपन की वजह से है पता है, लेकिन क्यों दूसरा एक अभी भी उत्पादन डेटा भी यह पूर्णांक की सूची के रूप में घोषित किया जाता है, मैं भी javap साथ की जाँच की, checkcast बाईटकोड केवल तीसरी उत्पादन में डाला जाता है।

मेरे प्रश्न हैं:

  1. यह एक बग है?

  2. कैसे जावैक निर्धारित करता है कि "कास्ट" कहां डालना है?

    public static void main(String[] args){ 
    List<String> a = Arrays.asList("abc","def"); 
    List<Integer> b = (List<Integer>)(List<?>)a; 
    System.out.println(b.size()); --output 2 
    System.out.println(b.get(1)); ---output "def" 
    System.out.println(b.get(1).getClass()); --error in type cast 
    

संपादित

नीचे इस सवाल का जवाब और When is generic return value of function casted after type erasure?, मेरे मामले के साथ काफी समान की जांच की गई। यदि हम इस What is meant by "the erasure of the static type of the expression on which it is called" in the getClass() docs? से उत्तर जोड़ते हैं, तो यह "कास्ट" नियम के बारे में बहुत स्पष्ट होगा।

कंपाइलर निर्धारित कर सकता है कि कास्ट डालने और प्रकार की सुरक्षा सुनिश्चित करने के लिए कहां है।

मेरा पहला मामला ठीक है क्योंकि यह वैसे भी वापस आ जाएगा।

दूसरा मामला ठीक है क्योंकि प्रिंटल ऑब्जेक्ट की अपेक्षा करता है। इसलिए टाइप सुरक्षा सुनिश्चित करने के लिए कोई कलाकार की आवश्यकता नहीं है।

थ्रेड केस तब नहीं है जब getClass() से कक्षा को वापस करने की उम्मीद है जो जेएलएस के अनुसार बी.जे.जी. (1) का स्थिर प्रकार है। तो कास्ट डाला गया है और टाइप कास्ट त्रुटि प्राप्त करें।

जैसा कि @ न्यूवाक्ट ने कहा, "आपको किसी भी तरह से तय करने के लिए कंपाइलर पर भरोसा नहीं करना चाहिए" (जब वैकल्पिक विकल्प होता है और टाइप सुरक्षा भी सुनिश्चित करता है, दूसरा मामला यहां)।

+0

# 2 टाइप एरर के कारण काम करता है। अब यह परवाह नहीं है कि आपने इसे एक इंटीजर होने के बारे में "झूठ बोला" क्योंकि यह किसी ऑब्जेक्ट के अलावा कुछ भी भूल गया है। मुझे नहीं पता क्यों # 3 विफल रहता है। – Novaterata

+0

@ नोवाटेराटा, मुझे ऐसा नहीं लगता है। मिटा केवल पैरामीटर चर को हटा नहीं है, बल्कि "आवश्यक कास्ट" भी डालें। इस प्रकार तीसरे व्यक्ति में एक कास्ट डाला जाता है, इसलिए यह ((इंटीजर) b.get (1)) होगा। GetClass() जो रनटाइम पर टाइपिंग में विफल हो जाएगा। – Keith

+0

# 2 और # 3 प्रिंट स्टेटमेंट्स का जिक्र कर रहे थे – Novaterata

उत्तर

0

पिछले उदाहरण में, कलाकारों के रूप में

Class clazz = ((Integer)b.get(1)).getClass(); 

और इसलिए अपवाद है, इस प्रकार होता है जहां दूसरी पंक्ति

System.out.println(b.get(1)); 

एक पूर्णांक के लिए निर्दिष्ट नहीं करता है और इसलिए डाली अभ्यस्त हो, इसे विफल करने के लिए इसे पूर्णांक में असाइन करें।

Integer x = b.get(1); //fails 
+0

विफल रहता है तो दूसरा सफल क्यों होता है? – Keith

+0

@ किथ संपादित करें –

+3

आपको 'getclass'' कॉल करने के लिए 'इंटीजर' पर डालने की आवश्यकता नहीं है, क्योंकि यह 'ऑब्जेक्ट' की विधि है। तो तीसरे मामले में एक कलाकार क्यों है? –

संबंधित मुद्दे