जावा में वेरिएबल के प्रकार की जांच कैसे करें?


120

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

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


परावर्तन एपीआई पर एक नज़र डालें ।
mschonaker

यहाँ जवाब के साथ बहुत संबंधित प्रश्न: stackoverflow.com/questions/2674554/…

जवाबों:


111

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

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

int x;

आप यह सुनिश्चित कर सकते हैं कि यह केवल intमूल्यों को धारण करेगा ।

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

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

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

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


3
इंस्टॉफ़ ऑपरेटर केवल चर द्वारा संदर्भित ऑब्जेक्ट के डेटाटाइप को निर्धारित करता है। यह वास्तविक VARIABLE के मूल स्वरूप के अनुरोध के अनुसार निर्धारित नहीं करता है।
ग्रांट रॉबर्टसन

38

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

उदाहरण:

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 );

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

6
@TashPemhiwa विकल्प में स्ट्रिंग और ऑब्जेक्ट जोड़ें। रचनात्मकता और समस्या को हल करना एक प्रोग्रामर की सबसे अच्छी संपत्ति है।
काटो

8
फिर भी यह केवल पूर्व-निर्धारित वर्गों के एक निश्चित सेट से निपट सकता है (जो वस्तु अभिविन्यास / बहुरूपता के उद्देश्य को पराजित करता है) और आपको केवल किसी अन्य वर्ग की वस्तुओं के लिए "अज्ञात वर्ग" जैसा कुछ देगा
अल्गोमैन

3
कौन सा हस्ताक्षर संकलित समय पर होता है, रनटाइम नहीं। इसलिए यह तकनीक आपको कुछ भी नहीं बताएगी जो आप पहले से ही संकलन समय पर नहीं जानते हैं। docs.oracle.com/javase/specs/jls/se7/html/…
jmh

26

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

boolean b = a instanceof String- आपको बताएंगे कि वास्तविक वस्तु किसके द्वारा निर्दिष्ट की गई aहै या नहीं । फिर, डेटाटाइप कि चरa को मूल रूप से घोषित किया गया था या बाद में उदाहरण के लिए संचालक के परिणाम पर कोई असर नहीं पड़ा।

मैंने इसकी जानकारी ली: आप जावा में परिवर्तनशील प्रकार को कैसे जानते हैं?

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

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


14

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


2
हमें बस एक वैध उपयोग का मामला है।
लोरेन

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

13

महज प्रयोग करें:

.getClass().getSimpleName();

उदाहरण:

StringBuilder randSB = new StringBuilder("just a String");
System.out.println(randSB.getClass().getSimpleName());

आउटपुट:

StringBuilder

1
मेरा सुझाव है कि randSBNULL रखने पर यह काम नहीं करता है।
बेसिल बॉर्क

8

खैर, मुझे लगता है कि चर के प्रकार की जांच इस तरह से की जा सकती है।

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! ");
}

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

PS हाँ, मुझे पता है कि यह भी आदिम के लिए जाँच नहीं करता है।


6

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

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


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


2

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

//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());       
}

1

इनमें से कोई भी उत्तर काम नहीं करता है यदि चर एक गैर-विनिर्मित जेनरिक प्रकार है

और जो मुझे मिल सकता है, वह केवल एक बहुत ही बदसूरत वर्कअराउंड का उपयोग करना संभव है , या अपने फ़ंक्शन के लिए एक प्रारंभिक पैरामीटर में पारित करके, इसे इन-प्लेस बनाकर, यहां देखें:

<T> T MyMethod(...){ if(T.class == MyClass.class){...}}

मान्य नहीं है क्योंकि आप Tपैरामीटर को सीधे टाइप नहीं कर सकते हैं, क्योंकि यह रनटाइम के समय मिट जाता है।

<T> void MyMethod(T out, ...){ if(out.getClass() == MyClass.class){...}}

यह काम करता है क्योंकि कॉल करने से outपहले वेरिएबल को इंस्टेंट करने के लिए कॉल करने वाला जिम्मेदार होता है । यह तब भी एक अपवाद को फेंक देगा जब बाहर बुलाया जाता है, लेकिन लिंक किए गए समाधान की तुलना में, यह ऐसा करने का सबसे आसान तरीका है

मुझे पता है कि यह एक प्रकार का विशिष्ट अनुप्रयोग है, लेकिन चूँकि यह जावा के साथ एक वैरिएबल के प्रकार को खोजने के लिए Google पर पहला परिणाम है (और Tयह एक प्रकार का वैरिएबल है), मुझे लगता है कि इसे शामिल किया जाना चाहिए


0

आप इसे आसानी से Java.lang.Class.getSimpleName()विधि का उपयोग करके देख सकते हैं यदि चर में गैर-आदिम प्रकार है। यह आदिम प्रकार इंट, लंबे आदि के साथ काम नहीं करता है।

संदर्भ - यहाँ Oracle डॉक्स लिंक है


0

मूल रूप से, उदाहरण के लिए:

public class Kerem
{
    public static void main(String[] args)
    {
        short x = 10;
        short y = 3;
        Object o = y;
        System.out.println(o.getClass()); // java.lang.Short
    }

}

1
एक छोटा संकेत: जब कोई प्रश्न होता है जो 10 साल पुराना है और उसके 10 उत्तर हैं, जिनमें से कुछ के पास 100 अपवोट्स हैं, तो यह (असंभव नहीं है) बहुत , बहुत संभावना नहीं है कि एक नया उत्तर कुछ उपयोगी जोड़ सकता है (विशेष रूप से, जब यह सिर्फ एक कोड स्निपेट होता है जो कहता है "यहाँ, देखो, यह कुछ प्रिंट करता है" ...)
मार्को 13

-4

सार्वजनिक वर्ग डेमो 1 {

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());

}

}

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.