आप जावा में एक चर प्रकार कैसे जानते हैं?


152

मान लीजिए कि मैं एक चर घोषित करता हूं:

String a = "test";

और मैं जानना चाहता हूं कि यह किस प्रकार का है, अर्थात, आउटपुट होना चाहिए java.lang.Stringमैं यह कैसे करूं?


1
क्या आप वास्तव में चर के प्रकार में रुचि रखते हैं ? या आप मूल्य के प्रकार के बारे में परवाह करते हैं ? क्योंकि चर का प्रकार आसानी से नहीं मिल सकता है (वास्तव में यह स्थानीय चर के लिए बिल्कुल भी संभव नहीं है और खेतों के लिए प्रतिबिंब की आवश्यकता है)।
जोकिम सॉर

8
@Paul: विचार करें Object o = "o";- चर का प्रकार ऑब्जेक्ट है, मान का प्रकार स्ट्रिंग है।
माइकल Borgwardt

2
@Paul In List<String> l = new ArrayList<String>();, वैरिएबल का List<String>प्रकार है, मान का प्रकार है ArrayList<String>
बेन लिंग 12

1
@Ben Lings चर का प्रकार java.util.ArrayList है और मान का प्रकार java.util.ArrayList है।
अजय ताकुर

1
@ अजयठाकुर - यह संकलन-समय (स्थिर) प्रकार और रनटाइम (गतिशील) प्रकार के बीच अंतर है।
बेन लिंग्स

जवाबों:


269
a.getClass().getName()

16
जो मान का प्रकार देगा। जरूरी नहीं कि चर का प्रकार।
जोआचिम सॉयर

7
मुझे लगा कि ओपी वास्तव में क्या देख रहा था क्योंकि घोषणा के aसंकलन समय में बहुत स्पष्ट है
मार्टिन

4
यह काम करेगा यदि प्रकार आदिम नहीं हैं ... यदि प्रकार अंतर है, तो प्रकार कैसे जानें?
मिगुएल रिबेरो

5
@ मिगुएल: चूंकि एक ही तरीका है जिससे आप एक intमान को संभाल सकते हैं int, एक चर में है, कोड लिखने का कोई तरीका नहीं है जो एक intमूल्य को संभालता है और उस प्रकार को नहीं जानता है। यदि आप एक रैपर को संभाल रहे हैं तो मामला अलग है Integer, लेकिन फिर इस उत्तर का कोड फिर से काम करता है।
जोआचिम सौर

1
यह एक आदिम प्रकार के लिए सच नहीं है।
मेहंदी

37

यदि आप नाम चाहते हैं, तो मार्टिन की विधि का उपयोग करें। यदि आप जानना चाहते हैं कि क्या यह एक निश्चित वर्ग का उदाहरण है:

boolean b = a instanceof String


15
क्या तुम मार्टिन नहीं हो? :)
सोकहुनली

अन्य मार्टिन ... LOL;)
चेंक्रूज़

थिक कोड Double a = 1d; boolean b = a instanceof String;त्रुटि का कारण बनेगाerror: incompatible types: Double cannot be converted to String
एलेक्स78191

35

मैं मार्टिन के उत्तर पर विस्तार करना चाहूंगा ...

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

मार्टिंस समाधान:

a.getClass().getName()

हालाँकि, यदि आप चाहते हैं कि आप कुछ भी कर सकें तो आप यह कर सकते हैं:

((Object) myVar).getClass().getName()
//OR
((Object) myInt).getClass().getSimpleName()

इस मामले में, आदिम बस एक आवरण में लपेटा जाएगा। आपको उस मामले में आदिम की वस्तु मिल जाएगी।

मैंने खुद इसे इस तरह इस्तेमाल किया है:

private static String nameOf(Object o) {
    return o.getClass().getSimpleName();
}

जेनरिक का उपयोग करना:

public static <T> String nameOf(T o) {
    return o.getClass().getSimpleName();
}

दिलचस्प। मैंने अभी आपके कोड की कोशिश की: System.out.println (((Object) Integer.parseInt ("" ") .getClass ()। GetSimpleName ()); और यह काम करता है! \ o /
शेवी

31

मैंने खोज इंजन से सीखा (मेरी अंग्रेजी बहुत खराब है, इसलिए कोड ...) चर का प्रकार कैसे प्राप्त करें? यूपीएस :

String str = "test";
String type = str.getClass().getName();
value: type = java.lang.String

यह विधि :

str.getClass().getSimpleName();
value:String

अब उदाहरण है:

Object o = 1;
o.getClass().getSimpleName();
value:Integer

3

जोचिम सौअर ने जो कहा उससे मैं सहमत हूं, यह जानना संभव नहीं है (चर प्रकार! मूल्य प्रकार नहीं!) जब तक कि आपका चर एक वर्गीय विशेषता नहीं है (और आपको वर्ग क्षेत्रों को पुनः प्राप्त करना होगा, नाम से सही क्षेत्र प्राप्त होगा ...)

वास्तव में मेरे लिए यह पूरी तरह से असंभव है कि कोई भी a.xxx().yyy()विधि आपको सही उत्तर दे क्योंकि उत्तर उसी तरह की वस्तु पर अलग होगा, जिस संदर्भ में आप इस विधि को कहते हैं ...

जैसा कि तेहु ने कहा, यदि आप परीक्षण करने के लिए प्रकारों की एक परिभाषित सूची को संकलित करने के लिए जानते हैं, तो आप इंस्टाफॉफ़ का उपयोग कर सकते हैं, लेकिन आपको उपवर्ग भी मिलेंगे।

एक संभावित समाधान यह भी होगा कि आप अपने कार्यान्वयन से खुद को प्रेरित करें java.lang.reflect.Fieldऔर अपनी Fieldकक्षा बनाएं , और फिर अपने सभी स्थानीय चर को इस कस्टम Fieldकार्यान्वयन के रूप में घोषित करें ... लेकिन आप बेहतर समाधान पाएंगे, मुझे वास्तव में आश्चर्य है कि आपको चर की आवश्यकता क्यों है प्रकार, और न केवल मूल्य प्रकार?


के लिए "लेकिन आप भी उपवर्गों को सच लौटाएंगे ..." , मुझे लगता है कि आपका मतलब था "लेकिन आपको माता-पिता की कक्षाएं भी सच में मिलेंगी ..." , ठीक है?
स्कोमीसा

3

जावा की ऑपरेटर ओवरलोडिंग सुविधा का उपयोग करें

class Test {

    void printType(String x) {
        System.out.print("String");
    }

    void printType(int x) {     
        System.out.print("Int");
    }

    // same goes on with boolean,double,float,object ...

}

8
जावा में ऑपरेटर ओवरलोडिंग की अवधारणा नहीं है, यह विधि ओवरलोडिंग है
निकोसिल

2

मुझे लगता है कि हमारे यहाँ कई समाधान हैं:

  • के कहने के लिए एक समाधान हो सकता है।

क्यों? जावा में प्रत्येक वर्ग को ऑब्जेक्ट क्लास से ही विरासत में मिला है। इसलिए यदि आपके पास एक चर है और आप इसके प्रकार को जानना चाहेंगे। आप उपयोग कर सकते हैं

  • Println (((वस्तु) च) .getClass () getName ()।);

या

  • Integer.class.isInstance (1985); // सच देता है

या

  • isPrimitive ()

    public static void main(String[] args) {
    
     ClassDemo classOne = new ClassDemo();
     Class classOneClass = classOne();
    
     int i = 5;
     Class iClass = int.class;
    
     // checking for primitive type
     boolean retval1 = classOneClass.isPrimitive();
     System.out.println("classOneClass is primitive type? = " + retval1);
    
     // checking for primitive type?
     boolean retval2 = iClass.isPrimitive();
     System.out.println("iClass is primitive type? = " + retval2);
    }

यह हमें देने जा रहा है:

  1. असत्य
  2. सच

यहां और अधिक जानकारी प्राप्त करें: एक आदिम चर के आदिम प्रकार का निर्धारण कैसे करें?

https://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html

http://docs.oracle.com/cd/E26806_01/wlp.1034/e14255/com/bea/p13n/expression/operator/Instanceof.html

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