যেহেতু এটি একটি বহুল রেফারেন্সযুক্ত প্রশ্ন, এবং বর্তমান উত্তরগুলি মূলত এটি কেন কাজ করে না তা ব্যাখ্যা করে (বা হ্যাকির প্রস্তাব দেয়, বিপজ্জনক সমাধান যা আমি কখনই প্রোডাকশন কোডে দেখতে চাই না), আমি মনে করি এটি অন্য উত্তর যুক্ত করা উপযুক্ত, প্রদর্শন করে সমস্যাগুলি এবং একটি সম্ভাব্য সমাধান।
এটি কেন সাধারণভাবে কাজ করে না তার কারণ ইতিমধ্যে অন্যান্য জবাবগুলিতে উল্লেখ করা হয়েছে: রূপান্তরটি আসলে বৈধ কিনা বা না তা মূল তালিকায় থাকা অবজেক্টের ধরণের উপর নির্ভর করে। যখন তালিকা যার ধরণ নয় বস্তু TestB
, কিন্তু একটি ভিন্ন উপশ্রেণী এর TestA
, তারপর নিক্ষেপ করা হয় না বৈধ।
অবশ্যই, কাস্টগুলি বৈধ হতে পারে। সংকলকটির জন্য উপলভ্য নয় এমন প্রকারগুলি সম্পর্কে আপনার মাঝে মাঝে তথ্য থাকে। এই ক্ষেত্রে, তালিকা কাস্ট করা সম্ভব, তবে সাধারণভাবে এটি সুপারিশ করা হয় না :
কেউ হয় ...
- ... পুরো তালিকা কাস্ট করুন বা
- ... তালিকার সমস্ত উপাদান নিক্ষেপ করুন
প্রথম পদ্ধতির (যা বর্তমানে গৃহীত উত্তরের সাথে মিল রয়েছে) এর প্রভাবগুলি সূক্ষ্ম are এটি প্রথম নজরে সঠিকভাবে কাজ করতে পারে বলে মনে হচ্ছে। তবে যদি ইনপুট তালিকায় কোনও ভুল ধরণের থাকে তবে একটি ClassCastException
কোড নিক্ষেপ করা হবে, সম্ভবত কোডের সম্পূর্ণ ভিন্ন জায়গায়, এবং এটির ডিবাগ করা এবং ভুল উপাদানটি তালিকায় কোথায় পিছলেছে তা খুঁজে পাওয়া শক্ত be সবচেয়ে খারাপ সমস্যাটি হল যে কেউ তালিকাটি তৈরি হওয়ার পরেও অবৈধ উপাদান যুক্ত করতে পারে , ডিবাগিংকে আরও জটিল করে তোলে।
এই স্পিউরিয়াস ডিবাগিংয়ের সমস্যাগুলি পদ্ধতির পরিবারের ClassCastExceptions
সাথে উপশম করা যেতে পারে Collections#checkedCollection
।
টাইপের উপর ভিত্তি করে তালিকা ফিল্টার করা হচ্ছে
A থেকে রূপান্তর একটি আরো টাইপ-নিরাপদ উপায় List<Supertype>
একটি থেকে List<Subtype>
আসলে হয় ফিল্টার তালিকা এবং একটি নতুন তালিকা নির্দিষ্ট ধরনের আছে যেটি শুধুমাত্র উপাদানগুলি রয়েছে তৈরি করুন। এই জাতীয় পদ্ধতি প্রয়োগের জন্য স্বাধীনতার কিছু ডিগ্রি রয়েছে (উদাহরণস্বরূপ null
এন্ট্রিগুলির চিকিত্সা সম্পর্কিত ), তবে একটি সম্ভাব্য বাস্তবায়ন এর মতো হতে পারে:
/**
* Filter the given list, and create a new list that only contains
* the elements that are (subtypes) of the class c
*
* @param listA The input list
* @param c The class to filter for
* @return The filtered list
*/
private static <T> List<T> filter(List<?> listA, Class<T> c)
{
List<T> listB = new ArrayList<T>();
for (Object a : listA)
{
if (c.isInstance(a))
{
listB.add(c.cast(a));
}
}
return listB;
}
এই পদ্ধতিটি স্বেচ্ছাচারিত তালিকাগুলি ফিল্টার করতে ব্যবহার করা যেতে পারে (কেবলমাত্র টাইপ পরামিতিগুলির সাথে প্রদত্ত সাব-টাইপ-সুপার টাইপের সম্পর্কের সাথে নয়), যেমন এই উদাহরণটিতে:
// A list of type "List<Number>" that actually
// contains Integer, Double and Float values
List<Number> mixedNumbers =
new ArrayList<Number>(Arrays.asList(12, 3.4, 5.6f, 78));
// Filter the list, and create a list that contains
// only the Integer values:
List<Integer> integers = filter(mixedNumbers, Integer.class);
System.out.println(integers); // Prints [12, 78]