2015-12-08 5 views
5
public int compareTo(Object x) { 
    Task other = (Task)x; 

    if (other.priority == this.priority) { 
     System.out.println("Each task has the same priority level."); 
     return 0; 
    } else if (other.priority > this.priority) { 
     System.out.println(other.priority + "\n" + this.priority); 
     return -1; 
    } else { 
     System.out.println(this.priority + "\n" + other.priority); 
     return 1; 
    } 
} 

यह कोड क्लास के लिए प्रोग्रामिंग असाइनमेंट के लिए है। मुझे यकीन नहीं है कि मैं Task other = (Task)x; का उपयोग क्यों करता हूं या यह यहां क्या कर रहा है। बाकी मैं समझता हूँ। अगर किसी के पास वास्तव में जो कुछ भी कर रहा है, उसके बारे में त्वरित स्पष्टीकरण है तो मैं बहुत अच्छा होगा। धन्यवाद!तुलना में एक कास्ट क्यों है (ऑब्जेक्ट)

+1

आप 'Comparable' या कुछ अन्य इंटरफेस को लागू कर रहे हैं? यदि ऐसा है, तो कक्षा घोषणा जोड़ने के लायक होगा। –

उत्तर

2

आप कास्ट कर रहे हैं Object xTask other के लिए - Object और Task विभिन्न प्रकार हैं, तो आप कलाकारों की जरूरत है ताकि आप x की उम्मीद प्रकार के रूप में इलाज कर सकते हैं (और यह क्षेत्रों है करने के लिए मिल)।

आम तौर पर compareTo() में आप पहली बार आँख बंद करके यह कास्टिंग से पहले if (x instanceof Task) की तरह कुछ होता है - अगर आप नहीं करते हैं और प्रकार तो अलग हैं बातें दुर्घटना जाएगा)

+1

... और क्योंकि ऐसा नहीं होता है, तो यदि आप कार्य और स्ट्रिंग कहें तो तुलना में कुछ गलत हो जाएगा। – gnasher729

+0

ठीक है, बहुत बहुत धन्यवाद! –

+0

@ साराहदीरी: अगर इस उत्तर ने आपकी मदद की है, तो कृपया इसे स्वीकार करें :) –

2

विधि हस्ताक्षर एक Object प्रकार वस्तु लेता है तो क्रम में करने के लिए पारित ऑब्जेक्ट के भीतर परिवर्तनीय priority का संदर्भ लें, इसे Task ऑब्जेक्ट पर एक कास्ट करना है क्योंकि चर केवल Task कक्षा के भीतर मौजूद है।

व्यक्तिगत रूप से हालांकि, मुझे लगता है कि यह बुरा अभ्यास था क्योंकि आप नहीं जानते कि किस तरह की वस्तु पारित की जा रही है (किसी भी वर्ग उपखंड Object में पारित किया जा सकता है) तो चेक का एक उदाहरण कम नहीं होगा जो आप चाहते हैं ClassCastException की रनटाइम त्रुटि में चलाएं।

वैकल्पिक रूप से, आप यह निर्दिष्ट करने के लिए generics का उपयोग कर सकते हैं कि आप किस प्रकार की ऑब्जेक्ट की तुलना करना चाहते हैं। तो बल्कि ऐसा करने से ...

public class Task implements Comparable { 
    private int priority = 1; 

    @Override 
    public int compareTo(Object o) { 
     if (o instanceof Task) { 
      Task t = (Task) o; 
      return this.priority < t.priority; 
     } 

     return -1; 
    } 
} 

... आप यह कर सकता है ...

public class Task implements Comparable<Task> { 
    private int priority = 1; 

    @Override 
    public int compareTo(Task t) { 
     return this.priority < t.priority; 
    } 
} 
+0

क्या मैं 'ऑब्जेक्ट एक्स' को कुछ और विशिष्ट में बदल सकता हूं (इस मामले में,' कार्य x' शायद)? मैं सबक से इंप्रेशन के तहत था कि वह 'यह कैसे किया गया था' था। –

+0

@ साराहदीरी 'ऑब्जेक्ट' से 'कार्य' से 'x' को बदलने के लिए केवल दो तरीके या तो कास्ट करना है (जिसे आप पहले से कर रहे हैं) या विधि पैरामीटर को केवल 'कार्य' ऑब्जेक्ट को पारित करने की अनुमति देने के लिए है पैरामीटर के रूप में। जावा जेनिक्स का उपयोग करके इसके लिए अनुमति देता है (इसलिए 'तुलनात्मक' लागू करने के बजाय 'तुलनात्मक ' लागू करता है)। इसका उपयोग करने से केवल 'कार्य' वस्तुओं को पारित करने की अनुमति होगी। – Ocracoke

+0

यह भी देखें [कच्चे प्रकार का क्या है और हम इसका उपयोग क्यों नहीं करना चाहिए?] (Http://stackoverflow.com/questions/2770321/what-is -एक-कच्चे-प्रकार और क्यों नहीं करना चाहिए--हम उपयोग यह) –

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