2015-08-31 9 views
5
class MyClass { 

    private String str; 
    public MyClass(String str){ 
     this.str = str; 
    } 
    public int compare(Object o) { 
     return str.compareTo(((MyClass)o).str); //line No.8 
    } 
} 

class Client { 
    public static void main(String[] args) { 
     MyClass m = new MyClass("abc"); 
     MyClass n = new MyClass("bcd"); 
     System.out.println(m.compare(n)); 
    } 
} 

क्यों इस कोड स्निपेट में लाइन नंबर 8 में डाली (MyClass)o आवश्यक है, तथ्य यह है क्लाइंट का आह्वान है कि तर्क जो MyClass वर्ग के उदाहरण हैं के साथ एक compare विधि के बावजूद?इस मामले में कलाकार क्यों जरूरी है?

मैं नीचे की तरह बनाने के लिए MyClass कक्षा में compare विधि को संशोधित जब:

public int compare(Object o) { 
     System.out.println(o.getClass()); 
     System.out.println(((MyClass)o).getClass()); 
     return str.compareTo(((MyClass)o).str); 
    } 

फिर, क्लाइंट निम्न परिणाम का उत्पादन करेगा:

class MyClass 
class MyClass 

इस प्रकार मुझे समझ नहीं आता क्यों उपरोक्त कास्ट आवश्यक है और मैं ऐसा क्यों नहीं कर सकता (बिना माई क्लास के कलाकार):

public int compare(Object o) { 
     return str.compareTo(o.str); 
    } 

क्योंकि जब मैं ऐसा, मैं संकलन समय त्रुटि मिलती है:

str cannot be resolved or is not a field 

उत्तर

8

यह संकलक संकलन समय पर जानता है। संकलन समय पर यह जानता है कि इस विधि में क्या पारित किया जा रहा है Object टाइप करें। इसका मतलब है कि यह Object वर्ग से जुड़े तरीकों की गारंटी दे सकता है, लेकिन MyClass टाइप करने के तरीके नहीं।

क्योंकि वह compare विधि प्रकार Object, या एक उपवर्ग के किसी भी तर्क लेता है, तो आप में कुछ भी अगर मैं एक वर्ग MyOtherClass इस तरह कर दे सकते हैं। क्या ..

public class MyOtherClass { 
    public String notStr; 
} 

और मैं की तरह कुछ करना ..

MyOtherClass myOtherClass = new MyOtherClass(); 
MyClass myClass = new MyClass(); 

myClass.compare(myOtherClass); 

कलाकार के बिना, अब आपको एक स्थिति मिली है जहां रनटाइम पर, यह उस क्षेत्र तक पहुंचने का प्रयास करता है जो वहां नहीं है। यह सुनिश्चित करने के लिए कि कास्ट सही प्रकार का है, या उस क्षेत्र तक पहुंचने का प्रयास करने से पहले यह विफल हो जाएगा।

बस के रूप में एक तरफ

मैं ग्रूवी नामक एक भाषा के साथ बड़े पैमाने पर काम कर रहा है। यह एक ऐसी भाषा है जो अनिवार्य रूप से जावा के शीर्ष पर बैठती है, लेकिन यह गतिशील बाध्यकारी और ढीली टाइपिंग जैसी चीजों का समर्थन करती है (जो आप यहां हैं)। यदि इस तरह की कार्यक्षमता आपके लिए होनी चाहिए, तो मैं documentation को देखने की अनुशंसा करता हूं।

1

ocompare में के प्रकार एक Object है। इसका मतलब पैरामीटर यह MyClass उदाहरण हो सकता है, लेकिन यह भी नहीं कर सका। Object में str नामक कोई फ़ील्ड नहीं है (जैसा कि वह MyClass से संबंधित है), इसलिए उस क्षेत्र को प्राप्त करने का कोई तरीका नहीं है, और इसलिए कोड संकलित नहीं हो सकता है। यदि आप MyClass पर डाले हैं, हालांकि, इसमें स्ट्र नामक फ़ील्ड होगा, और इसलिए यह इसे एक्सेस करने में सक्षम होगा।

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