2013-03-21 11 views
12

Void, void के बीच क्या अंतर है, और क्या मैं इसके बजाय null का उपयोग कर सकता हूं?java.lang.Void बनाम शून्य बनाम शून्य

मैं यह पूछ रहा हूं क्योंकि मैं नमूना एंड्रॉइड कोड देख रहा हूं जहां उन्होंने शून्य का उपयोग किया लेकिन ग्रहण त्रुटियों पर यह (Void cannot be resolved to a variable कहता है)।

मेरे कोड है कि टूट जाता है

public class MyAsyncTask extends AsyncTask<Void, Void, Boolean>{ 
    ... 
} 

है मैं इसे इस

MyAsyncTask myAsyncTask = new MyAsyncTask(); 
myAsyncTask.execute((Void),null);//this is the line that breaks "Void cannot be resolved to a variable" 
+0

यह मदद चाहते हैं, तो हम कोड है कि तोड़ने गया था देख सकता था। –

+0

मैं एक छोटा स्निपेट जोड़ने जा रहा हूं। बस इसे – Josh

+0

साफ़ करें जिस तरह से आप myAsyncTask.execute (नया शून्य [1]) भी आज़मा सकते हैं; = डी –

उत्तर

2

आपके पास अपने कोड में एक अतिरिक्त कॉमा है।

myAsyncTask.execute((Void),null); 
         //^extra comma right here 
इसके अलावा

,, Void को null कास्ट करने के लिए क्योंकि (1) Void कोई उदाहरण है और इस प्रकार वहाँ कोई Void वस्तु है कोई जरूरत नहीं है, और (2) कास्टिंग null कुछ भी करने के लिए नहीं बल्कि बेकार है क्योंकि अशक्त एक है किसी ऑब्जेक्ट डेटा प्रकार के लिए वैध मान।

कोड शायद सिर्फ होना चाहिए:

myAsyncTask.execute(null); 
+1

यह अतिरिक्त कॉमा धन्यवाद था! मुझे इसकी एक कास्ट नहीं पता था (मैंने इसके दो तर्कों को सोचा था) लेकिन किसी कारण से इसे कास्ट किया जाना चाहिए अन्यथा यह कहने में त्रुटियां होती हैं कि 'निष्पादन (शून्य []) माईएसिंक टास्क' – Josh

+2

प्रकार के लिए संदिग्ध है इस मामले में सबसे सुरक्षित शर्त है वास्तव में 'myAsyncTask.execute(); ' – battery

3

Void तरह का उपयोग कर रहा है "एक uninstantiable प्लेसहोल्डर वर्ग कक्षा वस्तु जावा कीवर्ड शून्य का प्रतिनिधित्व करने के लिए एक संदर्भ पकड़ करने के लिए।" (http://docs.oracle.com/javase/6/docs/api/java/lang/Void.html से)

void वापसी का संकेत देने वाला एक रिटर्न प्रकार है।

null मूल्य की अनुपस्थिति है।

0

java.lang.Voidvoid प्रकार का बॉक्सिंग प्रतिनिधित्व है। चूंकि आपके पास void प्रकार का उदाहरण नहीं हो सकता है, इसलिए यह अधिकतर पूर्णता के लिए है और दुर्लभ उदाहरण जहां आपको प्रतिबिंब के लिए इसकी आवश्यकता है।

+0

' java.lang.Void 'में बदल दिया। 'शून्य * के [बॉक्सिंग प्रतिनिधित्व] नहीं है (http://en.wikipedia.org/wiki/Object_type_ (ऑब्जेक्ट-ओरिएंटेड_प्रोग्रामिंग) # बॉक्सिंग)। इसे एक बॉक्स किए गए प्रतिनिधित्व को कॉल करने का तात्पर्य है कि आप एक आदिम लपेट रहे हैं। 'शून्य 'एक आदिम नहीं है, न ही यह एक प्रकार भी है, और कोई लपेटने वाला नहीं है। – Jeffrey

+0

कुछ संसाधन, जैसे कि http://www.idevelopment.info/data/Programming/java/miscellaneous_java/Java_Primitive_Types.html, उद्धरण 'शून्य' एक प्राचीन प्रकार के रूप में उद्धृत करें। यह निश्चित रूप से एक वर्ग नहीं है। इसका पूरा उद्देश्य प्राचीन प्रकार के समकक्ष उद्देश्य के लिए खड़ा होना है, जो वास्तव में "बॉक्सिंग प्रस्तुतिकरण" है। – Wug

+0

[जावा लैंगेज विशिष्टता] (http://docs.oracle.com/javase/specs/jls/se7/html/jls-14.html#jls-14.8) कहता है कि 'शून्य' एक प्रकार नहीं है। – Jeffrey

39

Void का सबसे आम उपयोग प्रतिबिंब के लिए है, लेकिन यह एकमात्र ऐसा स्थान नहीं है जहां इसका उपयोग किया जा सकता है।

void एक ऐसा कीवर्ड है जिसका अर्थ है कि किसी फ़ंक्शन का कोई मूल्य नहीं होता है।

java.lang.Void एक संदर्भ प्रकार है, उसके बाद निम्न मान्य है:

Void nil = null; 

(अब तक यह दिलचस्प नहीं है ...)

एक परिणाम के प्रकार के रूप में (की वापसी मूल्य के साथ एक समारोह Void टाइप करें) इसका मतलब है कि फ़ंक्शन * हमेशा * वापसी null (यह null के अलावा कुछ भी वापस नहीं कर सकता है, क्योंकि Void में कोई उदाहरण नहीं है)।

Void function(int a, int b) { 
    //do something 
    return null; 
} 

मैं एक समारोह है कि हमेशा रिटर्न अशक्त क्यों चाहते हैं?

जेनिक्स के आविष्कार से पहले, मेरे पास Void के लिए उपयोग का कोई मामला नहीं था।

जेनेरिक के साथ, कुछ दिलचस्प मामले हैं। उदाहरण के लिए, Future<T> अन्य धागे द्वारा किए गए एसिंक्रोनस ऑपरेशन के परिणामस्वरूप धारक है। Future.get ऑपरेशन मान (T टाइप करें) वापस कर देगा, और गणना के बाद तक ब्लॉक होगा।

लेकिन ... अगर वापस लौटने के लिए कुछ भी नहीं है तो क्या होगा? सरल: Future<Void> का उपयोग करें। उदाहरण के लिए, Google App Engine में Asyncronous Datastore सेवा delete ऑपरेशन Future<Void> देता है।get() उस भविष्य पर लागू किया गया है, null के बाद वापस लौटा दिया गया है। कोई Callable एस के साथ एक समान उदाहरण लिख सकता है।

अन्य उपयोग केस Map मूल्यों के बिना है, यानी Map<T,Void>। ऐसा नक्शा Set<T> जैसा व्यवहार करता है, तो यह उपयोगी हो सकता है जब Set के बराबर कार्यान्वयन नहीं होता है (उदाहरण के लिए, WeakHashSet नहीं है, तो कोई WeakHashMap<T,Void> का उपयोग कर सकता है)।

+0

यह एक बहुत अच्छी अंतर्दृष्टि है, मैं चाहता हूं कि मैं दो उत्तरों को सही के रूप में चिह्नित कर सकूं .. – Josh

+0

अच्छी व्याख्या जेवियर। बहुत धन्यवाद – Stephan

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