2011-07-09 16 views
23

क्या यह विधि true किसी भी तरह से वापस आ सकती है?क्या "आवृत्ति शून्य" हमेशा झूठी वापसी करता है?

public static <T> boolean isVoid(T t) 
{ 
    return t instanceof Void; 
} 
+1

आप इस विधि को कैसे कॉल करते हैं? क्या आप कुछ उदाहरण दे सकते हैं? –

+3

आप यह परीक्षण क्यों करना चाहते हैं? इस सब के पीछे कुछ कहानी होनी चाहिए। –

+2

@ होवरक्राफ्ट मैं बस इन मुश्किल व्यवहारों की तरह हूं, मैं "शून्य" –

उत्तर

51

हाँ, पर मुझे यकीन है कि वास्तव में उपयोगी नहीं है कर रहा हूँ:

public static void main(final String[] args) throws Exception { 
    final Constructor c = Void.class.getDeclaredConstructors()[0]; 
    c.setAccessible(true); 
    System.out.println(c.newInstance(null) instanceof Void); 
} 

एक Void वर्ग instantiated नहीं किया जा सकता है, ताकि सामान्य रूप से अपने कोड Void उदाहरणों से निपटने के लिए की आवश्यकता नहीं होगी। इसके बाद के संस्करण कोड स्निपेट सिर्फ तुम क्या कहर आप जब प्रतिबिंब का उपयोग कर सकते हैं दिलाने का एक उदाहरण है ... ;-)

+6

+1 प्रतिबिंब "दुरुपयोग" –

+2

+1 बहुत अच्छा है! बीटीडब्ल्यू, आप बस 'c.newInstance()' का उपयोग करें ('null' param की आवश्यकता नहीं है) – Bohemian

+6

+1 प्रतिबिंब के माध्यम से बनाने से रोका गया एकमात्र वर्ग कक्षा है। –

2

नहीं। यह सच आप इसे और प्रकार Void का एक तर्क पारित करने के लिए है वापसी बनाने के लिए। लेकिन कक्षा शून्य का कन्स्ट्रक्टर निजी है, इसलिए आप इसे कॉल नहीं कर सकते हैं। इसके अलावा, यह कक्षा अंतिम है, इसलिए आप इसे भी विस्तारित नहीं कर सकते हैं। इस प्रकार आप कक्षा Void का उदाहरण नहीं बना सकते हैं। लेकिन आपकी विधि को सही करने के लिए इसकी आवश्यकता है।

बीटीडब्ल्यू: यदि आप वास्तव में ऐसा करना चाहते हैं, तो प्रतिबिंब द्वारा Void के निर्माता को कॉल करें। लेकिन मैं इस बारे में एक सिस्टम दुरुपयोग अभ्यास के रूप में सोच सकता हूं। सौभाग्य।

2

नहीं:

Constructor<Void> cv = Void.class.getDeclaredConstructor(); 
cv.setAccessible(true); 
Void v = cv.newInstance(); 
System.out.println(v instanceof Void); //-> true 
6

मैं असफल देखने के लिए अगर एक मूल्य void (या Void), के बाद से की तरह कहा वें बार, instanciated नहीं किया जा सकता, या यहाँ तक कि के साथ हैकिंग के बिना बढ़ाया का एक उदाहरण है तुम क्यों की जाँच करेगा परछाई। हालांकि, एक और उपयोगी स्थिति के लिए, यदि आप जानना चाहते हैं कि दिया गया Class शून्य प्रकार का है, तो आप instanceof का उपयोग नहीं करेंगे और आपका विधि पैरामीटर इसके बजाय Class<?> प्रकार का होगा। एक परीक्षण मामला होगा:

public class VoidCheckTest { 

    public static void main(String...args) throws SecurityException, NoSuchMethodException { 
     Class<VoidCheckTest> c = VoidCheckTest.class; 

     Method m = c.getMethod("main", String[].class); 

     System.out.println(m.getReturnType().getName() + " = " + isVoid(m.getReturnType()));   
    } 

    private static boolean isVoid(Class<?> t) { 
     return Void.class.isAssignableFrom(t) || void.class.equals(t); 
    } 
} 

जो

void = true 

वहाँ अन्य उपयोग के मामलों इस विधि के लिए, लेकिन मैं नहीं किसी अन्य अभी देख पा रहे हैं हो सकता है उत्पादन होगा।

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