এই নিয়মটি লেগ্যাসি কোডে দ্বন্দ্ব এড়ানোর উদ্দেশ্যে তৈরি করা হয়েছে যা এখনও কাঁচা ধরণের ব্যবহার করে।
জেএলএস থেকে আঁকা কেন এটি অনুমোদিত নয়, এর একটি চিত্র এখানে । মনে করুন, জেনারিকদের জাভা পরিচয় করানোর আগে আমি কিছু কোড লিখেছিলাম:
class CollectionConverter {
List toList(Collection c) {...}
}
আপনি আমার ক্লাসটি এভাবে বাড়িয়ে দিন:
class Overrider extends CollectionConverter{
List toList(Collection c) {...}
}
জেনেরিকের প্রবর্তনের পরে, আমি আমার লাইব্রেরি আপডেট করার সিদ্ধান্ত নিয়েছি।
class CollectionConverter {
<T> List<T> toList(Collection<T> c) {...}
}
আপনি কোনও আপডেট করতে প্রস্তুত নন, তাই আপনি নিজের Overrider
ক্লাসটি একা রেখে যান। toList()
পদ্ধতিটি সঠিকভাবে ওভাররাইড করার জন্য , ভাষা ডিজাইনাররা সিদ্ধান্ত নিয়েছিলেন যে কোনও কাঁচা টাইপ যে কোনও জেনারাইডেড টাইপের সাথে "ওভাররাইড-সমতুল্য"। এর অর্থ হ'ল যদিও আপনার পদ্ধতির স্বাক্ষরটি এখন আর আমার সুপারক্লাসের স্বাক্ষরের সাথে আনুষ্ঠানিকভাবে সমান নয়, তবুও আপনার পদ্ধতিটি ওভাররাইড করে।
এখন, সময় পার হয়ে যায় এবং আপনি সিদ্ধান্ত নেন যে আপনি নিজের ক্লাস আপডেট করতে প্রস্তুত। কিন্তু আপনি একটু আপ, এবং এর পরিবর্তে সম্পাদনা বিদ্যমান, কাঁচা এর স্ক্রু toList()
পদ্ধতি, আপনি যোগ এই মত একটি নতুন পদ্ধতি:
class Overrider extends CollectionConverter {
@Override
List toList(Collection c) {...}
@Override
<T> List<T> toList(Collection<T> c) {...}
}
কাঁচা ধরণের ওভাররাইড সমতুল্যের কারণে, উভয় পদ্ধতিই toList(Collection<T>)
পদ্ধতিটিকে ওভাররাইড করার জন্য একটি বৈধ আকারে । তবে অবশ্যই, সংকলকটির একটি একক পদ্ধতি সমাধান করা দরকার। এই অস্পষ্টতা দূর করতে, ক্লাসগুলিকে একাধিক পদ্ধতি থাকতে দেওয়া হয় না যা ওভাররাইড সমতুল্য are অর্থাৎ ক্ষয় করার পরে একই পরামিতি প্রকারের একাধিক পদ্ধতি।
মূলটি হ'ল এটি একটি ভাষার নিয়ম যা কাঁচা প্রকারের সাহায্যে পুরানো কোডের সাথে সামঞ্জস্য বজায় রাখতে ডিজাইন করা হয়েছে। এটি টাইপ পরামিতিগুলি মুছার দ্বারা প্রয়োজনীয় কোনও সীমাবদ্ধতা নয়; কারণ সঙ্কলন সময়ে পদ্ধতির রেজোলিউশন ঘটে, পদ্ধতি শনাক্তকারীতে জেনেরিক ধরণের যোগ করা যথেষ্ট হত।