2010-10-22 17 views
80

मैं यह सुनिश्चित करने के लिए कैसे जांच सकता हूं कि मेरा चर एक int, array, double, आदि ... है?जावा में चर के प्रकार की जांच कैसे करें?

संपादित करें: उदाहरण के लिए, मैं कैसे जांच सकता हूं कि एक चर एक सरणी है? क्या ऐसा करने के लिए कुछ काम है?

+0

[प्रतिबिंब एपीआई] को एक नजर डालें (http://download.oracle.com/javase/tutorial/reflect/)। – mschonaker

उत्तर

8

आप इंट के बजाय इंटीजर के साथ काम कर सकते हैं, डबल की बजाय डबल, आदि (ऐसी कक्षाएं सभी आदिम प्रकारों के लिए मौजूद हैं)। फिर आप ऑपरेटर उदाहरण का उपयोग कर सकते हैं, जैसे if(var instanceof Integer){...}

+2

हमें केवल एक वैध उपयोग-मामले की आवश्यकता है। – EJP

+0

सबसे कुशल दृष्टिकोण की तरह लगता है। –

76

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

आपके द्वारा दिए गए उदाहरण (int, array, double) ये सभी प्राइमेटिव हैं, और उनमें से कोई उप-प्रकार नहीं हैं। इस प्रकार, यदि आप एक चर घोषित होने के लिए एक int:

int x; 

आप यकीन है कि यह केवल कभी int मूल्यों का आयोजन करेगा हो सकता है।

यदि आपने एक चर को List होने का घोषित किया है, तो यह संभव है कि परिवर्तक List के उप-प्रकारों को रखे। इन के उदाहरण ArrayList, LinkedList, शामिल आदि

आप एक List चर था, और आप को पता है कि यह एक ArrayList था, आप निम्न कर सके हैं:

List y; 
... 
if (y instanceof ArrayList) { 
    ...its and ArrayList... 
} 

हालांकि, अगर आप अपने आप को यह सोचने के लिए कि आपको ऐसा करने की ज़रूरत है, आप अपने दृष्टिकोण को फिर से सोचना चाहेंगे। ज्यादातर मामलों में, यदि आप ऑब्जेक्ट उन्मुख प्रिंसिपल का पालन करते हैं, तो आपको ऐसा करने की आवश्यकता नहीं होगी। निश्चित रूप से, हर नियम के अपवाद हैं, यद्यपि।

+0

उदाहरण ऑपरेटर केवल चर द्वारा संदर्भित ऑब्जेक्ट के डेटाटाइप को निर्धारित करता है। यह वास्तविक रूप से अनुरोध किए गए वास्तविक VARIABLE के डेटाटाइप को निर्धारित नहीं करता है। – GrantRobertson

7

आपके प्रश्न का पहला भाग व्यर्थ है। ऐसी कोई परिस्थिति नहीं है जिसमें आप संकलन समय पर एक आदिम चर के प्रकार को नहीं जानते।

दूसरे भाग को पुन: एकमात्र परिस्थिति, जिसे आप पहले से ही नहीं जानते हैं कि एक चर एक सरणी है, यदि यह एक वस्तु है। किस मामले में object.getClass().isArray() आपको बताएगा।

+4

मैं स्ट्रिंग से ऑब्जेक्ट से हैशपैप प्राप्त कर सकता हूं, उस हैशैप में एक int डाल सकता हूं, और इसे वापस खींच सकता हूं। केवल मुझे पता है कि यह एक "ऑब्जेक्ट" है और यह जांचना पड़ सकता है कि यह किस प्रकार है। यह नहीं कह रहा कि यह अच्छा है, बस यह कह रहा है कि यह संभव है। –

+0

@ matty-d बेशक, लेकिन वह वह नहीं है जिसके बारे में वह पूछ रहा है। – EJP

28

जावा की विधि अधिभार क्षमता का दुरुपयोग करके वास्तव में अपने स्वयं के परीक्षक को रोल करना काफी आसान है। हालांकि मैं अभी भी उत्सुक हूं यदि एसडीके में कोई आधिकारिक विधि है।

उदाहरण:

class Typetester { 
    void printType(byte x) { 
     System.out.println(x + " is an byte"); 
    } 
    void printType(int x) { 
     System.out.println(x + " is an int"); 
    } 
    void printType(float x) { 
     System.out.println(x + " is an float"); 
    } 
    void printType(double x) { 
     System.out.println(x + " is an double"); 
    } 
    void printType(char x) { 
     System.out.println(x + " is an char"); 
    } 
} 

तो:

Typetester t = new Typetester(); 
t.printType(yourVariable); 
+13

आईएमओ की कोई अच्छी विधि नहीं है। क्या होता है यदि मैं कुछ मनमानी प्रकार को पास करता हूं जो आपके टाइपपेस्टर क्लास में परिभाषित नहीं है - उदाहरण के लिए स्ट्रिंग, उदाहरण के लिए? –

+4

@TashPemhiwa फिर विकल्पों में स्ट्रिंग और ऑब्जेक्ट जोड़ें। रचनात्मकता और समस्या निवारण एक प्रोग्रामर सर्वोत्तम संपत्ति हैं। – Kato

+5

फिर भी यह केवल पूर्व परिभाषित वर्गों (जो वस्तु अभिविन्यास/बहुरूपता के उद्देश्य को हरा देता है) के एक निश्चित सेट से निपट सकता है और आपको केवल किसी अन्य वर्ग – Algoman

13

a.getClass().getName() - आप वास्तविक वस्तु a से संबोधित किया जाता का डेटाप्रकार, लेकिन नहीं डेटाप्रकार कि चर a मूल रूप में घोषित किया गया था दे देंगे या बाद में कास्ट किया।

boolean b = a instanceof String - आपको a द्वारा निर्दिष्ट वास्तविक वस्तु को एक विशिष्ट वर्ग का उदाहरण दिया जाएगा या नहीं। फिर, डेटाटाइप कि परिवर्तनीय a मूल रूप से घोषित किया गया था या उसके बाद ऑपरेटर के उदाहरण के परिणामस्वरूप कोई असर नहीं पड़ा था। How do you know a variable type in java?

यह तब हो सकता:

मैं से इस जानकारी को ले लिया। मैं एक int में String पार्स करने की कोशिश कर रहा हूं और मैं जानना चाहता हूं कि मेरा Integer.parseInt(s.substring(a, b)) इसे जोड़ने से पहले एक int या कचरा निकाल रहा है या नहीं।

वैसे, इसे प्रतिबिंब के रूप में जाना जाता है। यहाँ इस विषय पर कुछ अधिक जानकारी है: http://docs.oracle.com/javase/tutorial/reflect/

5

मैं का उपयोग कर यह किया: if(x.getClass() == MyClass.class){...}

-3

सार्वजनिक वर्ग demo1 {

Object printType(Object o) 
{ 
    return o; 
} 
public static void main(String[] args) { 

    Demo1 d=new Demo1(); 
    Object o1=d.printType('C'); 
    System.out.println(o1.getClass().getSimpleName()); 

} 

}

5

ठीक है, मैं कर सकते हैं चर के प्रकार की जाँच लगता है इस तरह से किया जाना चाहिए।

public <T extends Object> void checkType(T object) {  
    if (object instanceof Integer) 
     System.out.println("Integer "); 
    else if(object instanceof Double) 
     System.out.println("Double "); 
    else if(object instanceof Float) 
     System.out.println("Float : "); 
    else if(object instanceof List) 
     System.out.println("List! "); 
    else if(object instanceof Set) 
     System.out.println("Set! "); 
} 

इस तरह आपको एकाधिक अधिभारित विधियों की आवश्यकता नहीं है। मुझे लगता है कि अतिरिक्त लाभों के कारण सरणी पर संग्रह का उपयोग करना अच्छा अभ्यास है। ऐसा कहकर, मुझे नहीं पता कि सरणी प्रकार की जांच कैसे करें। शायद कोई इस समाधान में सुधार कर सकता है। उम्मीद है की यह मदद करेगा!

पीएस हाँ, मुझे पता है कि यह प्राइमेटिव्स की भी जांच नहीं करता है।

1

मैं इनमें से किसी भी उत्तर से खुश नहीं था, और जिस अधिकार में सही है, उसके पास कोई स्पष्टीकरण और नकारात्मक वोट नहीं है, इसलिए मैंने चारों ओर खोज की, कुछ सामान पाया और इसे संपादित किया ताकि इसे समझना आसान हो। इसके साथ एक नाटक है, जैसा कि उम्मीद है उतना आगे नहीं।

//move your variable into an Object type 
Object obj=whatYouAreChecking; 
System.out.println(obj); 

// moving the class type into a Class variable 
Class cls=obj.getClass(); 
System.out.println(cls); 

// convert that Class Variable to a neat String 
String answer = cls.getSimpleName(); 
System.out.println(answer); 

यहाँ एक विधि है:

public static void checkClass (Object obj) { 
    Class cls = obj.getClass(); 
    System.out.println("The type of the object is: " + cls.getSimpleName());  
} 
संबंधित मुद्दे