যদি শ্রেণি B
এবং শ্রেণি শ্রেণীর C
বর্ধিত হয় A
এবং আমার ধরণের একটি অবজেক্ট থাকে B
বা তবে C
, আমি কোন ধরণের এটি উদাহরণ হিসাবে নির্ধারণ করতে পারি?
যদি শ্রেণি B
এবং শ্রেণি শ্রেণীর C
বর্ধিত হয় A
এবং আমার ধরণের একটি অবজেক্ট থাকে B
বা তবে C
, আমি কোন ধরণের এটি উদাহরণ হিসাবে নির্ধারণ করতে পারি?
উত্তর:
if (obj instanceof C) {
//your code
}
if(!(obj instanceof C))
code
চাইল্ড 1 চাইল্ড 1 = নতুন চাইল্ড 1 () চেষ্টা করুন; প্যারেন্ট 1 প্যারেন্টচাইল্ড = নতুন চাইল্ড 2 (); চাইল্ড 2 চাইল্ড 2 = নতুন চাইল্ড 2 (); (সন্তানের 1 উদাহরণস্বরূপ প্যারেন্ট 1); (চাইল্ড 1 উদাহরণসুত্র শিশু 1); (চাইল্ড 2 অফ প্যারেন্টচিল্ড); (পিতা-মাতৃত্বের প্রথম উদাহরণ পিতা-মাতা 1); (চাইল্ড 1 উদাহরণস্বরূপ পিতা-সন্তানের); code
, এটি উদাহরণের উদ্দেশ্যটি পরিষ্কার করতে পারে।
অবজেক্ট.জেটক্লাস () ব্যবহার করুন । এটি বস্তুর রানটাইম টাইপ প্রদান করে।
একাধিক সঠিক উত্তর উপস্থাপন করা হয়েছিল, তবে আরও আরও পদ্ধতি রয়েছে: Class.isAssignableFrom()
এবং কেবলমাত্র বস্তুটি কাস্ট করার চেষ্টা করা হয়েছে (যা একটি ফেলে দিতে পারে ClassCastException
)।
আসুন পরীক্ষার সম্ভাব্য উপায়গুলি সংক্ষিপ্ত করে দেখি যদি কোনও বস্তু obj
টাইপের উদাহরণ হিসাবে থাকে C
:
// Method #1
if (obj instanceof C)
;
// Method #2
if (C.class.isInstance(obj))
;
// Method #3
if (C.class.isAssignableFrom(obj.getClass()))
;
// Method #4
try {
C c = (C) obj;
// No exception: obj is of type C or IT MIGHT BE NULL!
} catch (ClassCastException e) {
}
// Method #5
try {
C c = C.class.cast(obj);
// No exception: obj is of type C or IT MIGHT BE NULL!
} catch (ClassCastException e) {
}
null
পরিচালনার ক্ষেত্রে পার্থক্যnull
পরিচালনা করার ক্ষেত্রে একটি পার্থক্য রয়েছে যদিও:
false
যদি obj
হয় null
( null
তবে কোনও কিছুর উদাহরণ নয়) তা মূল্যায়ন করে ।NullPointerException
স্পষ্টতই নিক্ষেপ করবে ।null
কারণ null
যে কোনও ধরণের কাস্ট করা যেতে পারে!মনে রাখতে হবে:
null
এটি কোনও ধরণের উদাহরণ নয় তবে এটি কোনও প্রকারে কাস্ট করা যেতে পারে ।
Class.getName()
" আইটেম - অফ- " পরীক্ষা করার জন্য ব্যবহার করা উচিত নয় যদি বস্তুটি টাইপ না করে C
তবে এর একটি সাবক্লাস থাকে, এটির সম্পূর্ণ আলাদা নাম এবং প্যাকেজ থাকতে পারে (সুতরাং শ্রেণীর নামগুলি অবশ্যই মেলে না) তবে এটি এখনও টাইপ C
।Class.isAssignableFrom()
নয় : প্রকারটি যদি একটি সাবক্লাস হয় তবে ফিরে আসবে ।obj.getClass().isAssignableFrom(C.class)
false
obj
C
তুমি ব্যবহার করতে পার:
Object instance = new SomeClass();
instance.getClass().getName(); //will return the name (as String) (== "SomeClass")
instance.getClass(); //will return the SomeClass' Class object
আছে HTH। তবে আমি মনে করি বেশিরভাগ সময় নিয়ন্ত্রণ প্রবাহ বা অনুরূপ কোনও কিছুর জন্য এটি ব্যবহার করা ভাল অভ্যাস নয় ...
প্রস্তাবিত যে কোনও পদ্ধতির যে কোনও ব্যবহারকে কোড গন্ধ হিসাবে বিবেচনা করা হয় যা খারাপ ওও ডিজাইনের ভিত্তিতে তৈরি।
যদি আপনার নকশাটি ভাল হয় তবে আপনার নিজেকে ব্যবহার করার প্রয়োজন getClass()
বা খুঁজে পাওয়া উচিত নয় instanceof
।
প্রস্তাবিত পদ্ধতিগুলির যে কোনও একটি করবে, তবে ডিজাইনের ভিত্তিতে কিছু মনে রাখবেন something
আমরা এক্ষেত্রে প্রতিবিম্ব ব্যবহার করতে পারি
objectName.getClass().getName();
উদাহরণ: -
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String name = request.getClass().getName();
}
এই ক্ষেত্রে আপনি ক্লাসের নামটি পাবেন যা কোন HttpServletRequest
ইন্টারফেসের রেফারেন্স ভেরিয়েবলের কাছে পাস করবে object
obj.getClass()
শব্দ classname, prefixex ফিরে আসবেclass
request.getClass().getName();
সমস্ত প্যাকেজ মুদ্রণ! শ্রেণীর নাম সহ
ক্লাসে একটি .isInstance
পদ্ধতিও রয়েছে Class
। যদি আপনি একটি বস্তুর বর্গ পেতে মাধ্যমে myBanana.getClass()
যদি আপনি আপনার বস্তুর দেখতে পারেন myApple
হিসাবে একই ক্লাসের একটা নিদর্শন হয় myBanana
মাধ্যমে
myBanana.getClass().isInstance(myApple)
isinstance()
আপনি রান সময় জানতে চাইলে চেক করা যথেষ্ট হবে না। ব্যবহার করুন:
if(someObject.getClass().equals(C.class){
// do something
}
আমি আমার জেনারেল ইউটিস ক্লাসে ঘা ফাংশনটি ব্যবহার করি, এটি কার্যকর হতে পারে তা পরীক্ষা করুন
public String getFieldType(Object o) {
if (o == null) {
return "Unable to identify the class name";
}
return o.getClass().getName();
}
আমি জাভা 8 জেনেরিকগুলি রানটাইমটিতে স্যুইচ কেসটি ব্যবহার না করার পরিবর্তে অবজেক্টের উদাহরণটি কী তা পেতে পেতে ব্যবহার করি
public <T> void print(T data) {
System.out.println(data.getClass().getName()+" => The data is " + data);
}
যে কোনও ডেটা পাস করুন এবং পদ্ধতিটি কল করার সময় আপনি যে ধরণের ডেটা পাস করেছেন তা মুদ্রণ করবে। যেমন
String str = "Hello World";
int number = 10;
double decimal = 10.0;
float f = 10F;
long l = 10L;
List list = new ArrayList();
print(str);
print(number);
print(decimal);
print(f);
print(l);
print(list);
নিম্নলিখিত আউটপুট হয়
java.lang.String => The data is Hello World
java.lang.Integer => The data is 10
java.lang.Double => The data is 10.0
java.lang.Float => The data is 10.0
java.lang.Long => The data is 10
java.util.ArrayList => The data is []