জাভায় instanceof অপারেটর সাধারণত একটি অবজেক্ট নির্দিষ্ট টাইপের কিনা তা পরীক্ষা করতে ব্যবহৃত হয়। তবে, জেনেরিক্স ব্যবহার করার সময় Type Erasure-এর কারণে কিছু সীমাবদ্ধতা থাকে। এই প্রবন্ধে আমরা instanceof অপারেটর এবং Generic Type Checking এর কার্যপদ্ধতি ব্যাখ্যা করব।
Type Erasure এবং Generic Type Checking
জেনেরিক্স জাভার কম্পাইল-টাইমে কাজ করে, কিন্তু Runtime-এ জাভার টাইপ প্যারামিটার সম্পর্কিত তথ্য মুছে (erase) ফেলে। এর ফলে:
- Runtime-এ জেনেরিক টাইপ সম্পর্কে সরাসরি জানা যায় না।
instanceofদিয়ে সরাসরি জেনেরিক টাইপ পরীক্ষা করা যায় না।
উদাহরণ:
List<String> stringList = new ArrayList<>();
if (stringList instanceof List<String>) { // Compile-time Error
System.out.println("This is a List of Strings");
}
উপরের কোডটি Compile-time Error দেবে কারণ List<String> টাইপটি Runtime-এ উপলব্ধ নয়।
Type Checking এর সমাধান
১. Raw Type ব্যবহার করে instanceof পরীক্ষা
Runtime-এ জেনেরিক টাইপের পরিবর্তে raw type ব্যবহার করা যায়।
import java.util.List;
import java.util.ArrayList;
public class InstanceOfExample {
public static void main(String[] args) {
List<String> stringList = new ArrayList<>();
if (stringList instanceof List) { // Checks against raw type
System.out.println("This is a List");
}
}
}
আউটপুট:
This is a List
দ্রষ্টব্য: এটি কাজ করে, কিন্তু টাইপের বিশুদ্ধতা নিশ্চিত করতে পারে না। এটি শুধু যাচাই করে যে এটি একটি
Listকিনা।
২. ক্লাস টোকেন (Class<T>) দিয়ে টাইপ পরীক্ষা করা
Class অবজেক্ট ব্যবহার করে নির্দিষ্ট টাইপ চেক করা যায়। এটি সাধারণত জেনেরিক মেথড বা ক্লাসে ব্যবহৃত হয়।
import java.util.List;
import java.util.ArrayList;
public class TypeCheckWithClass {
public static <T> boolean isInstanceOfType(Object obj, Class<T> clazz) {
return clazz.isInstance(obj);
}
public static void main(String[] args) {
List<String> stringList = new ArrayList<>();
System.out.println(isInstanceOfType(stringList, List.class)); // true
System.out.println(isInstanceOfType(stringList, ArrayList.class)); // true
}
}
আউটপুট:
true
true
Wildcard ব্যবহার করে Generic Type Checking
Wildcard (<?>) ব্যবহার করে জেনেরিক টাইপ চেক করা যায়, তবে এটি Runtime-এ নির্দিষ্ট টাইপ চেক নিশ্চিত করে না।
import java.util.ArrayList;
import java.util.List;
public class WildcardInstanceCheck {
public static void main(String[] args) {
List<String> stringList = new ArrayList<>();
List<Integer> intList = new ArrayList<>();
if (stringList instanceof List<?>) { // Valid
System.out.println("stringList is an instance of List<?>");
}
if (intList instanceof List<?>) { // Valid
System.out.println("intList is an instance of List<?>");
}
}
}
আউটপুট:
stringList is an instance of List<?>
intList is an instance of List<?>
Generic Type Checking ইন্টারফেস বা মেথডে
উদাহরণ ১: টাইপ টেস্টিং মেথড
import java.util.List;
public class GenericTypeChecker {
public static <T> boolean checkType(Object obj, Class<T> type) {
return type.isInstance(obj);
}
public static void main(String[] args) {
List<String> stringList = List.of("A", "B", "C");
System.out.println(checkType(stringList, List.class)); // true
System.out.println(checkType("Test", String.class)); // true
System.out.println(checkType(123, String.class)); // false
}
}
আউটপুট:
true
true
false
সীমাবদ্ধতা এবং পরামর্শ
- Type Erasure-এর কারণে সরাসরি Generic Type চেক করা যায় না।
<T>Runtime-এ কনভার্ট হয়ে raw type-এ পরিণত হয়।
instanceofraw type-এ কাজ করে, কিন্তু নির্দিষ্ট টাইপ পরীক্ষা করতে পারে না।- Type Token বা Class Object ব্যবহার করা জেনেরিক টাইপ চেকের সবচেয়ে কার্যকর উপায়।
- Wildcard (
<?>) নির্দিষ্ট টাইপ না জানিয়ে Generic Collection চেক করতে ব্যবহার করা যেতে পারে।
জাভার জেনেরিক্সে instanceof এর সীমাবদ্ধতাগুলো Type Erasure-এর কারণে হয়। নির্দিষ্ট টাইপ চেক করার জন্য Class Object বা Wildcards ব্যবহার করা উত্তম পদ্ধতি। এটি টাইপ সেফ কোড নিশ্চিত করার পাশাপাশি Runtime-এ টাইপ মিসম্যাচের ঝুঁকি হ্রাস করে।
Read more