Java Generics কম্পাইল টাইমে টাইপ চেকিং নিশ্চিত করার জন্য কাজ করে। তবে, জাভা Virtual Machine (JVM) এ Generics সরাসরি সমর্থন করে না। Generics কম্পাইল টাইমে কাজ করে এবং রানটাইমে Generics সম্পর্কিত টাইপ তথ্য মুছে ফেলা হয়। এই প্রক্রিয়াটিকে বলা হয় Type Erasure।
Type Erasure কী?
Type Erasure হল Generics এর টাইপ প্যারামিটার কম্পাইল টাইমে সরিয়ে ফেলা এবং তার পরিবর্তে raw type (যেমন Object বা নির্দিষ্ট বাউন্ড টাইপ) ব্যবহার করার প্রক্রিয়া। এটি Generics-সমর্থিত কোডকে JVM-এ চালানোর জন্য উপযুক্ত করে তোলে, কারণ JVM শুধুমাত্র raw টাইপ বোঝে।
Type Erasure এর কাজের ধাপ
- Generics টাইপ মুছে ফেলা (Remove Type Parameters):
Generics কোড কম্পাইল হওয়ার সময় টাইপ প্যারামিটার মুছে ফেলা হয় এবংObjectবা নির্দিষ্ট বাউন্ড টাইপে প্রতিস্থাপিত হয়।উদাহরণ:
public class GenericBox<T> { private T item; public void setItem(T item) { this.item = item; } public T getItem() { return item; } }কম্পাইল টাইমে এটি হয়ে যায়:
public class GenericBox { private Object item; public void setItem(Object item) { this.item = item; } public Object getItem() { return item; } }
- Bounded Type Parameters Handling:
যদি টাইপ প্যারামিটার একটি বাউন্ডেড টাইপে সীমাবদ্ধ থাকে (যেমন<T extends Number>), তাহলে Generics টাইপ সেই বাউন্ড টাইপে প্রতিস্থাপিত হয়।উদাহরণ:
public <T extends Number> void display(T value) { System.out.println(value); }কম্পাইলের পর এটি হয়ে যায়:
public void display(Number value) { System.out.println(value); }
- Type Cast যুক্ত করা (Add Type Casts):
যেহেতু টাইপ প্যারামিটার মুছে ফেলা হয়, সঠিক টাইপ নিশ্চিত করতে প্রয়োজনীয় টাইপ কাস্ট কম্পাইলার যোগ করে।উদাহরণ:
GenericBox<String> box = new GenericBox<>(); String item = box.getItem();কম্পাইল হওয়ার পর এটি হয়:
GenericBox box = new GenericBox(); String item = (String) box.getItem();
Type Erasure এর কারণে সীমাবদ্ধতা
- Runtime Type Checking সম্ভব নয়:
Generics রানটাইমে উপলব্ধ না থাকায় টাইপ চেকিং সম্ভব হয় না।উদাহরণ:
List<String> stringList = new ArrayList<>(); List<Integer> intList = new ArrayList<>(); if (stringList.getClass() == intList.getClass()) { System.out.println("Same class"); }আউটপুট:
Same classকারণ, কম্পাইলের পরে উভয় লিস্টই
List<Object>হয়ে যায়।
- Primitive টাইপ ব্যবহার করা যায় না:
Generics শুধুমাত্র Reference টাইপের জন্য কাজ করে। Primitive টাইপের ক্ষেত্রে, Wrapper Class ব্যবহার করতে হয়।উদাহরণ:
List<int> list = new ArrayList<>(); // Compile-time error List<Integer> list = new ArrayList<>(); // Correct
- Overloading Generics Methods বা Classes সম্ভব নয়:
টাইপ Erasure এর কারণে Generics এর সাথে Method Overloading সমস্যাযুক্ত হয়।উদাহরণ:
public void method(List<String> list) {} public void method(List<Integer> list) {} // Compile-time error
- Reified Types এর অভাব:
Generics টাইপ তথ্য Erasure হওয়ার কারণে,TবাT[]এর মতো টাইপের runtime instanceof চেক করা যায় না।উদাহরণ:
if (list instanceof List<String>) { // Compile-time error // Not allowed }
Type Erasure এর সুবিধা
- Backward Compatibility:
Type Erasure এর মাধ্যমে পুরনো JVM এবং bytecode এর সাথে নতুন Generics সমর্থিত কোড চলতে পারে। - কমপ্লেক্সিটি হ্রাস:
Type Erasure JVM এর কাজ সহজ করে, কারণ এটি শুধুমাত্র raw টাইপ নিয়ে কাজ করে।
উদাহরণ: Type Erasure প্রয়োগ
public class ErasureExample<T> {
T item;
public void setItem(T item) {
this.item = item;
}
public T getItem() {
return item;
}
}
কম্পাইলের পরে এটি পরিবর্তিত হয়:
public class ErasureExample {
Object item;
public void setItem(Object item) {
this.item = item;
}
public Object getItem() {
return item;
}
}
Generics এবং Type Erasure এর মধ্যকার সম্পর্ক সংক্ষেপে
- Generics: Compile-time টাইপ চেকিং এবং টাইপ-সেফ কোডের জন্য ব্যবহৃত হয়।
- Type Erasure: Generics এর কম্পাইল টাইম টাইপ তথ্য মুছে ফেলে runtime-এ raw টাইপ ব্যবহার করে।
- Generics রানটাইমে উপলব্ধ না থাকায়, runtime type checking সম্ভব নয়।
- Type Erasure এর মাধ্যমে পুরনো জাভা কোডের সাথে সামঞ্জস্য বজায় রাখা সহজ হয়।
Generics এবং Type Erasure এর এই সমন্বয় জাভার কোডের স্থিতিশীলতা ও পুনর্ব্যবহারযোগ্যতা বৃদ্ধি করে।
Read more