আপনি জাভাতে একটি পরিবর্তনশীল প্রকারটি কীভাবে জানবেন?


152

আসুন আমি বলি যে আমি একটি ভেরিয়েবল ঘোষণা করি:

String a = "test";

এবং আমি এটি কী ধরণের, অর্থাৎ আউটপুট হওয়া উচিত java.lang.Stringতা আমি কীভাবে করব তা জানতে চাই?


1
আপনি কি ভেরিয়েবলের ধরণের বিষয়ে সত্যই আগ্রহী ? অথবা আপনি কি মানের ধরণের সম্পর্কে যত্নশীল ? কারণ ভেরিয়েবলের ধরণ সহজেই অর্জন করা যায় না (বাস্তবে এটি স্থানীয় ভেরিয়েবলের পক্ষে মোটেই সম্ভব নয় এবং ক্ষেত্রগুলির জন্য প্রতিবিম্ব প্রয়োজন)।
জোচিম সৌর

8
@ পল: বিবেচনা করুন Object o = "o";- ভেরিয়েবলের ধরণটি অবজেক্ট, মানটির ধরণ স্ট্রিং।
মাইকেল বর্গওয়ার্ট

2
@ পল ইন List<String> l = new ArrayList<String>();, ভেরিয়েবলের List<String>ধরণ, মানের ধরণ ArrayList<String>
বেন লিংস

1
@ বেন লিংস ভেরিয়েবলের প্রকারটি 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
তুমিও কি মার্টিন না? :)
seokhoonlee

অন্য মার্টিন ... LOL;)
চংক্রুজ

আপনার কোডটি Double a = 1d; boolean b = a instanceof String;ত্রুটির কারণ error: incompatible types: Double cannot be converted to String
ঘটবে

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 ((অবজেক্ট) Integer.parseInt ("12")) .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প্রয়োগ হিসাবে আপনার সমস্ত স্থানীয় ভেরিয়েবলগুলি ঘোষণা করুন ... তবে আপনি আরও একটি সমাধান খুঁজে পেতে চাইলে আমি সত্যিই অবাক হব কেন আপনার ভেরিয়েবলটি দরকার i টাইপ, এবং না শুধুমাত্র মান টাইপ?


জন্য "কিন্তু আপনার কাছে সত্য ফিরে উপশ্রেণী পাবেন ..." , আমি মনে করি আপনি বোঝানো "কিন্তু আপনার কাছে সত্য ফিরে পিতা বা মাতা শ্রেণীর পাবেন ..." ঠিক আছে,?
স্কোমিসা

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

আমি মনে করি আমাদের এখানে একাধিক সমাধান রয়েছে:

  • উদাহরণ একটি সমাধান হতে পারে।

কেন? জাভাতে প্রতিটি শ্রেণিই অবজেক্ট শ্রেণি থেকে উত্তরাধিকার সূত্রে প্রাপ্ত। সুতরাং আপনার যদি একটি পরিবর্তনশীল থাকে এবং আপনি এর প্রকারটি জানতে চান। তুমি ব্যবহার করতে পার

  • System.out.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

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.