জাভা জেনেরিক্সে টাইপ ইরেজার (Type Erasure) কারণে রানটাইমে ArrayList এবং ArrayList একই টাইপ। কিন্তু কম্পাইল টাইমে টাইপ সেফ্টির জন্য এগুলো আলাদা। কনভার্সনের জন্য Wildcard (?) ব্যবহার করা হয়।
১. ArrayList<String> → ArrayList<Object> (Upcasting via Wildcard)
ArrayList> (Unbounded Wildcard) ব্যবহার করে টাইপ চেক বাইপাস করা যায়।
উদাহরণ
import java.util.ArrayList;
import java.util.Iterator;
public class ArrayListExample {
public static void main(String args[]) {
// Object টাইপের ArrayList
ArrayList<Object> list = new ArrayList<Object>();
list.add("apples");
list.add("mangoes");
list.add("oranges");
// String টাইপে কনভার্ট (Unchecked Cast - Warning আসবে)
@SuppressWarnings("unchecked")
ArrayList<String> stringList = (ArrayList<String>)(ArrayList<?>)(list);
// কন্টেন্ট প্রিন্ট
Iterator<String> it = stringList.iterator();
while(it.hasNext()) {
System.out.println(it.next());
}
}
}
আউটপুট
apples mangoes oranges
সতর্কতা: এটি Unchecked Cast। যদি list-এ স্ট্রিং বাদে অন্য টাইপের অবজেক্ট থাকে, তবে রানটাইমে ClassCastException হবে। কম্পাইলার ওয়ার্নিং দেবে।
২. ArrayList<Object> → ArrayList<String> (Downcasting - সেফ নয়)
সাধারণত এটি করা উচিত নয়, কারণ ArrayList-এ যেকোনো অবজেক্ট থাকতে পারে। কিন্তু যদি নিশ্চিত হোন যে শুধু স্ট্রিং আছে, তবে:
উদাহরণ
ArrayList<String> stringList = new ArrayList<>();
stringList.add("apples");
stringList.add("mangoes");
// String List কে Object List এ (Implicit Upcast - Safe)
ArrayList<Object> objectList = new ArrayList<>(stringList); // Copy Constructor
// Object List কে String List এ (Explicit Downcast - Unsafe)
@SuppressWarnings("unchecked")
ArrayList<String> backToString = (ArrayList<String>)(ArrayList<?>)objectList;
ভালো প্র্যাকটিস: টাইপ সেফ কনভার্সন (Stream API - Java 8+)
র─── রানটাইম এরর এড়াতে স্ট্রিম ব্যবহার করে নতুন লিস্ট বানান:
// Object List → String List (Safe, New List)
ArrayList<Object> objList = new ArrayList<>(Arrays.asList("a", "b", 123)); // Mixed!
ArrayList<String> strList = objList.stream()
.filter(e -> e instanceof String)
.map(e -> (String) e)
.collect(Collectors.toCollection(ArrayList::new));
// String List → Object List (Always Safe)
ArrayList<Object> objList2 = new ArrayList<>(strList); // Implicit widening
সারসংক্ষেপ: রстат করলে ওয়ার্নিং দবায় @SuppressWarnings("unchecked")। প্রোডাকশন কোডে স্ট্রিম/ফিল্টার ব্যবহার করে টাইপ সেফ কনভার্সন করুন।