2009-03-24 19 views
109

जावा में जेनेरिक्स के उपयोग मैं एक समारोह वापसी प्रकार के रूप में Void होने को लागू करने के लिए होने में समाप्त हो गया के कारण:यदि कोई विधि का रिटर्न प्रकार शून्य है तो मैं वापस क्या करूँ? (शून्य नहीं!)

public Void doSomething() { 
    //... 
} 

और संकलक की मांग है कि मैं कुछ लौट आते हैं। अभी के लिए मैं सिर्फ null लौट रही है, लेकिन यह है कि अगर अच्छा कोडन अभ्यास है मैं सोच रहा हूँ ...

मैं भी Void.class, void, Void.TYPE, new Void(), कोई वापसी बिल्कुल की कोशिश की है, लेकिन यह सब 'नहीं करता है बिल्कुल काम नहीं करते। (कम या ज्यादा स्पष्ट कारणों के लिए) (विवरण के लिए this answer देखें)

  • तो क्या मैं अगर एक समारोह की वापसी प्रकार Void है वापस जाने के लिए माना जाता रहा हूँ?
  • Void कक्षा का सामान्य उपयोग क्या है?

संपादित करें: बस आप downvotes अतिरिक्त: मैं के बारे में वी OID, नहीं वी OID पूछ रहा हूँ। कक्षा Void, आरक्षित कीवर्ड void नहीं है।

उत्तर

98

तो अगर मुझे फ़ंक्शन का रिटर्न प्रकार Void होना चाहिए तो मुझे क्या वापस करना होगा?

return null का उपयोग करें। Void को तत्काल नहीं किया जा सकता है और Class<T>void के प्रकार के लिए केवल प्लेसहोल्डर है।

Void का बिंदु क्या है?

जैसा ऊपर बताया गया है, यह प्लेसहोल्डर है। Void वह है जो आप वापस प्राप्त करेंगे यदि उदाहरण के लिए, void के रिटर्न प्रकार वाले विधि को देखने के लिए प्रतिबिंब का उपयोग करें। (तकनीकी रूप से, आप Class<Void> वापस प्राप्त करेंगे।) इन लाइनों के साथ अन्य मिश्रित उपयोग हैं, जैसे कि आप Callable<T> को पैरामीटर बनाना चाहते हैं।

जावा में जेनरिक के उपयोग मैं इस समारोह को लागू करने के लिए होने में समाप्त हो गया के कारण

मैं कहना चाहते हैं, तो आप इस के साथ एक विधि लागू करने की जरूरत कुछ अपने एपीआई के साथ फंकी हो सकता है कि हस्ताक्षर। ध्यान से विचार करें कि क्या आप चाहते हैं कि करने के लिए एक बेहतर तरीका है (शायद आप एक अलग, अनुवर्ती प्रश्न में अधिक जानकारी प्रदान कर सकते हैं?)।मैं थोड़ा संदिग्ध हूं, क्योंकि यह केवल "जेनेरिक के उपयोग के कारण" आया था।

+11

शून्य वापस करने के बाद सभी के बाद इतना मजेदार नहीं है। इसे बस उदाहरण के लिए अनिवार्य किया जा सकता है कॉल करने योग्य । कभी-कभी आपको कुछ वापस करने की आवश्यकता नहीं होती है लेकिन इसका उपयोग नहीं कर सकता Runnable। – Bombe

+0

शून्य के वैध उपयोग हैं, जैसा कि मैंने नोट किया था। लेकिन उन्होंने कहा कि "यह केवल जेनेरिक के उपयोग के कारण आया था"। इससे यह ध्वनि लगता है जैसे उन्होंने एक संग्रह में कुछ किया जो शून्य का उपयोग करने की आवश्यकता है, जो मैं कहूंगा कि यह एक असाधारण मामला है। –

+0

संग्रह के साथ यह वास्तव में बहुत अजीब होगा। – Bombe

18

return null जाने का रास्ता है।

0

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

+0

मैं एक जरूरी नहीं होगा; यह सिर्फ सम्मेलन है। –

23

शून्य को तुरंत चालू करने का कोई तरीका नहीं है, इसलिए केवल वापसी शून्य हो सकती है।

+13

अधिक सटीक रूप से, बुराई किए बिना शून्य को तुरंत चालू करने का कोई तरीका नहीं है। –

17

स्पष्ट करने के लिए क्यों अन्य सुझाव दिया था काम नहीं है: एक ही वस्तु के लिए

Void.class और Void.TYPE बिंदु और प्रकार Class<Void> के हैं, Void की नहीं।

यही कारण है कि आप उन मानों को वापस नहीं कर सकते हैं। new Void()Void प्रकार का होगा लेकिन यह कन्स्ट्रक्टर मौजूद नहीं है। वास्तव में, Void में कोई सार्वजनिक कन्स्ट्रक्टर नहीं है और इसलिए इसे तत्काल नहीं किया जा सकता है: पॉलिमॉर्फिक null को छोड़कर आप Void प्रकार का कोई ऑब्जेक्ट कभी नहीं प्राप्त कर सकते हैं।

आशा है कि इससे मदद मिलती है! :-)

+0

मामूली सुधार: 'शून्य। वाईपीईई '' void.class' को इंगित नहीं करता है। यह 'void.class' को इंगित करता है। – shmosel

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