2008-11-24 16 views
80

मैंने कहीं कोड के इस टुकड़े को देखा और सोचा:क्यों नल कास्ट?

doSomething((MyClass) null); 

आप कभी भी इस किया है: कब और क्यों किसी को निम्न करना होगा? क्या आप अपना अनुभव साझा कर सकते हैं?

+0

: ShowMessage("Test", (Control) null);
दूसरे के लिए:

पहले समारोह कॉल करने के लिए? या कोई ऐसा व्यक्ति जिसने कोड को कुछ बदल दिया ((कास्ट) कुछ); और इसे शून्य में बदलना चाहता था, और सिर्फ कास्ट को हटाने के लिए परेशान नहीं था? क्या यह एक से अधिक जगह या सिर्फ एक उदाहरण में है? –

+0

मुझे याद नहीं है कि मैंने इसे कहाँ पढ़ा है, लेकिन मैंने इसे देखा और सीखा कि आप किसी ऑब्जेक्ट को शून्य बना सकते हैं। समस्या यह है कि, मुझे उचित परिदृश्य नहीं मिल रहा है! : पी – pek

+0

संभावित डुप्लिकेट [क्यों ऑब्जेक्ट को नल डाला गया है?] (Http://stackoverflow.com/questions/5806163/why-cast-null-to-object) – Archmede

उत्तर

125

तो doSomething ओवरलोड हो गया है, तो आप MyClass तो सही अधिभार चुना जाता है करने के लिए स्पष्ट रूप से अशक्त कास्ट करने के लिए की जरूरत है:

public void doSomething(MyClass c) { 
    // ... 
} 

public void doSomething(MyOtherClass c) { 
    // ... 
} 

एक गैर काल्पनिक स्थिति है जहाँ आप कास्ट करने के लिए किया जाता है जब आप एक varargs फ़ंक्शन को कॉल की जरूरत है:

class Example { 
    static void test(String code, String... s) { 
     System.out.println("code: " + code); 
     if(s == null) { 
      System.out.println("array is null"); 
      return; 
     } 
     for(String str: s) { 
      if(str != null) { 
       System.out.println(str); 
      } else { 
       System.out.println("element is null"); 
      } 
     } 
     System.out.println("---"); 
    } 

    public static void main(String... args) { 
     /* the array will contain two elements */ 
     test("numbers", "one", "two"); 
     /* the array will contain zero elements */ 
     test("nothing"); 
     /* the array will be null in test */ 
     test("null-array", (String[])null); 
     /* first argument of the array is null */ 
     test("one-null-element", (String)null); 
     /* will produce a warning. passes a null array */ 
     test("warning", null); 
    } 
} 

अंतिम पंक्ति निम्न चेतावनी का उत्पादन करेगा:

उदाहरण। Java:26: चेतावनी: गैर-varargs पिछले पैरामीटर के लिए अयोग्य तर्क प्रकार के साथ varargs विधि का कॉल; एक varargs कॉल एक गैर varargs कॉल के लिए java.lang.String[] को
कास्ट और इस चेतावनी को दबाने के लिए

+0

NullPointerException के बारे में क्या? मुझे यह जवाब मिला, लेकिन मैंने इसके लिए एक असली दुनिया परिदृश्य नहीं छोड़ा! क्या आपने यह किया है? क्यूं कर? – pek

+1

अक्सर यूनिट परीक्षणों में आप एक फ़ंक्शन –

+3

पर शून्य हो सकते हैं यह NullPointerException से संबंधित नहीं है। आप शून्य को निराश नहीं करते हैं। आप केवल MyClass के संदर्भ के प्रकार को बदलते हैं ताकि अधिभार पुनर्विक्रय सही विधि पा सके। Aygunes एक अच्छा उदाहरण प्रदान किया जहां यह उपयोग किया जा सकता है –

32

मान लीजिए कि आप इन दोनों कार्यों है, और लगता है कि वे एक वैध रूप null स्वीकार करते हैं के लिए java.lang.String को
डाली दूसरे पैरामीटर के लिए मूल्य।

void ShowMessage(String msg, Control parent);
void ShowMessage(String msg, MyDelegate callBack);

इन दोनों तरीकों अपने दूसरे मापदंडों के प्रकार के आधार पर ही भिन्न होते हैं। यदि आप उनमें से एक को null के साथ दूसरे पैरामीटर के रूप में उपयोग करना चाहते हैं, तो आपको संबंधित फ़ंक्शन के दूसरे तर्क के प्रकार पर null डालना होगा, ताकि संकलक यह तय कर सके कि कौन सा फ़ंक्शन कॉल करना है। सिर्फ एक अनुभवहीन सांकेतिक शब्दों में बदलनेवाला शायद ShowMessage("Test2", (MyDelegate) null);

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