আমার ভেরিয়েবলটি কোন int, অ্যারে, ডাবল ইত্যাদি ... তা নিশ্চিত করার জন্য আমি কীভাবে পরীক্ষা করতে পারি?
সম্পাদনা: উদাহরণস্বরূপ, আমি কীভাবে পরীক্ষা করতে পারি যে একটি ভেরিয়েবল একটি অ্যারে হয়? এটি করার জন্য কিছু ফাংশন আছে?
আমার ভেরিয়েবলটি কোন int, অ্যারে, ডাবল ইত্যাদি ... তা নিশ্চিত করার জন্য আমি কীভাবে পরীক্ষা করতে পারি?
সম্পাদনা: উদাহরণস্বরূপ, আমি কীভাবে পরীক্ষা করতে পারি যে একটি ভেরিয়েবল একটি অ্যারে হয়? এটি করার জন্য কিছু ফাংশন আছে?
উত্তর:
জাভা একটি স্ট্যাটিকালি টাইপড ল্যাঙ্গুয়েজ, তাই সংকলক আপনার জন্য এই পরীক্ষার বেশিরভাগ কাজ করে। একবার আপনি কোনও ভেরিয়েবলকে নির্দিষ্ট ধরণের হিসাবে ঘোষণা করার পরে, সংকলকটি নিশ্চিত করে যে এটি কেবলমাত্র সেই ধরণের (বা সেই ধরণের উপ-প্রকারের মানগুলি) নির্ধারিত হয়।
আপনি যে উদাহরণগুলি দিয়েছেন ( int, অ্যারে, double) এগুলি সমস্ত আদিম, এবং সেগুলির কোনও উপ-প্রকার নেই। সুতরাং, আপনি যদি ভেরিয়েবলটিকে একটি হিসাবে ঘোষণা করেন int:
int x;
আপনি নিশ্চিত হতে পারেন যে এটি কেবল সর্বদা অনুষ্ঠিত হবে int মান ।
আপনি যদি ভেরিয়েবলটিকে একটি হিসাবে ঘোষনা করেন Listতবে, এটি সম্ভব হয় যে চলকটি উপ-প্রকারের ধারণ করে List। এই উদাহরণ অন্তর্ভুক্ত ArrayList,LinkedList ইত্যাদি
আপনার যদি Listভেরিয়েবল থাকে এবং আপনার এটির প্রয়োজন ছিল তা জানতে হবে ArrayList, আপনি নিম্নলিখিতগুলি করতে পারেন:
List y;
...
if (y instanceof ArrayList) {
...its and ArrayList...
}
তবে, আপনি যদি নিজেকে এমনটি করার দরকার মনে করেন তবে আপনি নিজের পদ্ধতির বিষয়ে নতুন করে ভাবতে চাইতে পারেন। বেশিরভাগ ক্ষেত্রে, আপনি যদি অবজেক্ট-ভিত্তিক নীতিগুলি অনুসরণ করেন তবে আপনার এটি করার দরকার হবে না। অবশ্যই প্রতিটি নিয়মের ব্যতিক্রম আছে, যদিও।
জাভা এর পদ্ধতি ওভারলোড ক্ষমতা অপব্যবহার করে, আপনার নিজের পরীক্ষককে রোল করা আসলে বেশ সহজ। যদিও এসডিকে কোনও অফিসিয়াল পদ্ধতি থাকলে আমি এখনও আগ্রহী।
উদাহরণ:
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 );
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/
আপনি ইন্টির পরিবর্তে পূর্ণসংখ্যা, ডাবলের পরিবর্তে ডাবল ইত্যাদির সাহায্যে কাজ করতে পারেন (এ জাতীয় ক্লাস সমস্ত প্রকারভেদে রয়েছে exists তারপরে আপনি অপারেটর উদাহরণটি যেমন ব্যবহার করতে পারেনif(var instanceof Integer){...}
শুধু ব্যবহার করুন:
.getClass().getSimpleName();
উদাহরণ:
StringBuilder randSB = new StringBuilder("just a String");
System.out.println(randSB.getClass().getSimpleName());
আউটপুট:
StringBuilder
randSBNULL ধরে রাখলে এটি কাজ করে না ।
ঠিক আছে, আমি ভেরিয়েবলের ধরণটি পরীক্ষা করে এইভাবে করা যেতে পারে বলে আমি মনে করি।
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! ");
}
এইভাবে আপনার একাধিক ওভারলোড পদ্ধতি নেই। আমি মনে করি সংযোজন সুবিধার কারণে অ্যারেগুলিতে সংগ্রহগুলি ব্যবহার করা ভাল অনুশীলন। এটি বলার পরে, আমি কীভাবে অ্যারে টাইপের জন্য চেক করব তা জানি না। হয়তো কেউ এই সমাধান উন্নতি করতে পারেন। আশাকরি এটা সাহায্য করবে!
পিএস হ্যাঁ, আমি জানি যে এটি আদিমদের জন্যও পরীক্ষা করে না।
আপনার প্রশ্নের প্রথম অংশটি অর্থহীন। এমন কোনও পরিস্থিতি নেই যেখানে আপনি সংকলনের সময় কোনও আদিম পরিবর্তনশীলের ধরণটি জানেন না।
দ্বিতীয় অংশটি পুনরায় করুন, আপনি যদি ইতিমধ্যে জানেন না যে ভেরিয়েবল একটি অ্যারে হয় তবে এটি যদি কোনও অবজেক্ট হয়। কোন ক্ষেত্রে object.getClass().isArray()আপনাকে বলবে।
আমি এটি ব্যবহার করে করেছি: if(x.getClass() == MyClass.class){...}
আমি এই উত্তরের কোনওটিতেই সন্তুষ্ট ছিলাম না, এবং এর সঠিকটির কোনও ব্যাখ্যা এবং নেতিবাচক ভোট নেই তাই আমি আশেপাশে অনুসন্ধান করেছি, কিছু জিনিস পেয়েছি এবং এটি সম্পাদনা করেছি যাতে এটি সহজে বোঝা যায়। এটির সাথে একটি নাটক করুন, সরাসরি আশা করা যায় না 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());
}
ভেরিয়েবলটি একটি অনির্বাচিত জেনেরিক ধরণের হলে এই উত্তরগুলির কোনওটিই কাজ করে না
এবং আমি যা দেখতে পাচ্ছি তা থেকে এটি কেবলমাত্র অত্যন্ত কুৎসিত workaround ব্যবহার করে বা আপনার কার্যক্রমে একটি প্রাথমিক পরামিতিটি প্রবেশ করে, স্থানটিতে তৈরি করে, এখানে দেখুন:
<T> T MyMethod(...){ if(T.class == MyClass.class){...}}
বৈধ নয় কারণ আপনি Tরান টাইম সময়ে মুছে ফেলা হওয়ায় আপনি প্যারামিটার থেকে টাইপটি সরাসরি টানতে পারবেন না ।
<T> void MyMethod(T out, ...){ if(out.getClass() == MyClass.class){...}}
এটি কাজ করে কারণ কলারটি ভেরিয়েবলটি তাত্ক্ষণিকভাবে দায়ী করার জন্য দায়বদ্ধ out আগে । এটি কল করার সময় যদি শূন্য হয় তবে এটি একটি ব্যতিক্রম ছুঁড়ে ফেলবে, তবে সংযুক্ত সমাধানের সাথে তুলনা করলে এটি করা এখন পর্যন্ত সবচেয়ে সহজ উপায় way
আমি জানি এটি এক ধরণের নির্দিষ্ট অ্যাপ্লিকেশন, তবে যেহেতু জাভা সহ ভেরিয়েবলের ধরণের সন্ধান করার জন্য গুগলে এটি প্রথম ফলাফল (এবং প্রদত্ত যে Tএটি এক ধরণের পরিবর্তনশীল) তবে আমি মনে করি এটি অন্তর্ভুক্ত করা উচিত
আপনি এটি ব্যবহার করে সহজেই চেক করতে পারেন Java.lang.Class.getSimpleName()ভেরিয়েবলের অ-আদিম টাইপ থাকলে মেথড । এটি আদিম ধরনের, দীর্ঘ ইত্যাদি নিয়ে কাজ করে না
রেফারেন্স - এখানে ওরাকল ডক্স লিঙ্কটি রয়েছে
মূলত: উদাহরণস্বরূপ:
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
}
}