জাভাতে কীভাবে ভেরিয়েবলের পরীক্ষা করতে হয়?


120

আমার ভেরিয়েবলটি কোন int, অ্যারে, ডাবল ইত্যাদি ... তা নিশ্চিত করার জন্য আমি কীভাবে পরীক্ষা করতে পারি?

সম্পাদনা: উদাহরণস্বরূপ, আমি কীভাবে পরীক্ষা করতে পারি যে একটি ভেরিয়েবল একটি অ্যারে হয়? এটি করার জন্য কিছু ফাংশন আছে?


দেখে নিন ব্যবহার করার প্রতিফলন এপিআই
মিসচোনকার

উত্তরের সাথে খুব সম্পর্কিত প্রশ্ন: স্ট্যাকওভারফ্লো . com / প্রশ্নস / ২676745৫৫৪/২
এ.এলেসিয়ো

উত্তর:


111

জাভা একটি স্ট্যাটিকালি টাইপড ল্যাঙ্গুয়েজ, তাই সংকলক আপনার জন্য এই পরীক্ষার বেশিরভাগ কাজ করে। একবার আপনি কোনও ভেরিয়েবলকে নির্দিষ্ট ধরণের হিসাবে ঘোষণা করার পরে, সংকলকটি নিশ্চিত করে যে এটি কেবলমাত্র সেই ধরণের (বা সেই ধরণের উপ-প্রকারের মানগুলি) নির্ধারিত হয়।

আপনি যে উদাহরণগুলি দিয়েছেন ( int, অ্যারে, double) এগুলি সমস্ত আদিম, এবং সেগুলির কোনও উপ-প্রকার নেই। সুতরাং, আপনি যদি ভেরিয়েবলটিকে একটি হিসাবে ঘোষণা করেন int:

int x;

আপনি নিশ্চিত হতে পারেন যে এটি কেবল সর্বদা অনুষ্ঠিত হবে int মান ।

আপনি যদি ভেরিয়েবলটিকে একটি হিসাবে ঘোষনা করেন Listতবে, এটি সম্ভব হয় যে চলকটি উপ-প্রকারের ধারণ করে List। এই উদাহরণ অন্তর্ভুক্ত ArrayList,LinkedList ইত্যাদি

আপনার যদি Listভেরিয়েবল থাকে এবং আপনার এটির প্রয়োজন ছিল তা জানতে হবে ArrayList, আপনি নিম্নলিখিতগুলি করতে পারেন:

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

তবে, আপনি যদি নিজেকে এমনটি করার দরকার মনে করেন তবে আপনি নিজের পদ্ধতির বিষয়ে নতুন করে ভাবতে চাইতে পারেন। বেশিরভাগ ক্ষেত্রে, আপনি যদি অবজেক্ট-ভিত্তিক নীতিগুলি অনুসরণ করেন তবে আপনার এটি করার দরকার হবে না। অবশ্যই প্রতিটি নিয়মের ব্যতিক্রম আছে, যদিও।


3
উদাহরণস্বরূপ অপারেটর কেবল ভেরিয়েবল দ্বারা উল্লেখ করা বস্তুর ডেটাটাইপ নির্ধারণ করে। এটি মূলত অনুরোধ অনুসারে প্রকৃত ভ্যারিয়েবলের ডেটাটাইপ নির্ধারণ করে না।
গ্র্যান্টরোবার্টসন

38

জাভা এর পদ্ধতি ওভারলোড ক্ষমতা অপব্যবহার করে, আপনার নিজের পরীক্ষককে রোল করা আসলে বেশ সহজ। যদিও এসডিকে কোনও অফিসিয়াল পদ্ধতি থাকলে আমি এখনও আগ্রহী।

উদাহরণ:

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
একটি ভাল পদ্ধতি আইএমও নয়। আমি যদি কিছু টাইপস পাস করি তবে তা আপনার টাইপস্টের ক্লাসে সংজ্ঞায়িত হয়নি - উদাহরণস্বরূপ স্ট্রিংয়ে?
তাশ পেমিভা

6
@ টাশপেমিভা তারপর স্ট্রিং এবং পছন্দগুলিতে অবজেক্ট যুক্ত করুন। সৃজনশীলতা এবং সমস্যা সমাধান একটি প্রোগ্রামার সেরা সম্পদ।
কটো 18

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

আপনি ইন্টির পরিবর্তে পূর্ণসংখ্যা, ডাবলের পরিবর্তে ডাবল ইত্যাদির সাহায্যে কাজ করতে পারেন (এ জাতীয় ক্লাস সমস্ত প্রকারভেদে রয়েছে exists তারপরে আপনি অপারেটর উদাহরণটি যেমন ব্যবহার করতে পারেন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! ");
}

এইভাবে আপনার একাধিক ওভারলোড পদ্ধতি নেই। আমি মনে করি সংযোজন সুবিধার কারণে অ্যারেগুলিতে সংগ্রহগুলি ব্যবহার করা ভাল অনুশীলন। এটি বলার পরে, আমি কীভাবে অ্যারে টাইপের জন্য চেক করব তা জানি না। হয়তো কেউ এই সমাধান উন্নতি করতে পারেন। আশাকরি এটা সাহায্য করবে!

পিএস হ্যাঁ, আমি জানি যে এটি আদিমদের জন্যও পরীক্ষা করে না।


6

আপনার প্রশ্নের প্রথম অংশটি অর্থহীন। এমন কোনও পরিস্থিতি নেই যেখানে আপনি সংকলনের সময় কোনও আদিম পরিবর্তনশীলের ধরণটি জানেন না।

দ্বিতীয় অংশটি পুনরায় করুন, আপনি যদি ইতিমধ্যে জানেন না যে ভেরিয়েবল একটি অ্যারে হয় তবে এটি যদি কোনও অবজেক্ট হয়। কোন ক্ষেত্রে object.getClass().isArray()আপনাকে বলবে।


5
আমি স্ট্রিং থেকে অবজেক্টে হ্যাশম্যাপ রাখতে পারি, সেই হ্যাশম্যাপে একটি int রাখতে পারি এবং এটিকে আবার বাইরে টেনে আনতে পারি। কেবলমাত্র আমি জানি যে এটি একটি "অবজেক্ট" এবং এটি কী ধরণের তা পরীক্ষা করতে পারে। এটি ভাল বলছেন না, কেবল এটি সম্ভব বলে দিচ্ছেন।
ম্যাটি-ডি


2

আমি এই উত্তরের কোনওটিতেই সন্তুষ্ট ছিলাম না, এবং এর সঠিকটির কোনও ব্যাখ্যা এবং নেতিবাচক ভোট নেই তাই আমি আশেপাশে অনুসন্ধান করেছি, কিছু জিনিস পেয়েছি এবং এটি সম্পাদনা করেছি যাতে এটি সহজে বোঝা যায়। এটির সাথে একটি নাটক করুন, সরাসরি আশা করা যায় না straight

//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

ভেরিয়েবলটি একটি অনির্বাচিত জেনেরিক ধরণের হলে এই উত্তরগুলির কোনওটিই কাজ করে না

এবং আমি যা দেখতে পাচ্ছি তা থেকে এটি কেবলমাত্র অত্যন্ত কুৎসিত workaround ব্যবহার করে বা আপনার কার্যক্রমে একটি প্রাথমিক পরামিতিটি প্রবেশ করে, স্থানটিতে তৈরি করে, এখানে দেখুন:

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

বৈধ নয় কারণ আপনি Tরান টাইম সময়ে মুছে ফেলা হওয়ায় আপনি প্যারামিটার থেকে টাইপটি সরাসরি টানতে পারবেন না ।

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

এটি কাজ করে কারণ কলারটি ভেরিয়েবলটি তাত্ক্ষণিকভাবে দায়ী করার জন্য দায়বদ্ধ out আগে । এটি কল করার সময় যদি শূন্য হয় তবে এটি একটি ব্যতিক্রম ছুঁড়ে ফেলবে, তবে সংযুক্ত সমাধানের সাথে তুলনা করলে এটি করা এখন পর্যন্ত সবচেয়ে সহজ উপায় way

আমি জানি এটি এক ধরণের নির্দিষ্ট অ্যাপ্লিকেশন, তবে যেহেতু জাভা সহ ভেরিয়েবলের ধরণের সন্ধান করার জন্য গুগলে এটি প্রথম ফলাফল (এবং প্রদত্ত যে Tএটি এক ধরণের পরিবর্তনশীল) তবে আমি মনে করি এটি অন্তর্ভুক্ত করা উচিত


0

আপনি এটি ব্যবহার করে সহজেই চেক করতে পারেন Java.lang.Class.getSimpleName()ভেরিয়েবলের অ-আদিম টাইপ থাকলে মেথড । এটি আদিম ধরনের, দীর্ঘ ইত্যাদি নিয়ে কাজ করে না

রেফারেন্স - এখানে ওরাকল ডক্স লিঙ্কটি রয়েছে


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 upvotes হয়, তাহলে এটা (অসম্ভব নয় কিন্তু) খুব , খুব অসম্ভাব্য যে একটি নতুন উত্তর কিছু দরকারী যোগ করতে পারেন (বিশেষ করে, যখন এটি কেবল একটি কোড স্নিপেট থাকে যা "এখানে দেখুন, এটি কিছু প্রিন্ট করে" ...)
মার্কো 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());

}

}

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