জেনেরিকের সাথে রানটাইম টাইপ পরীক্ষার জন্য দুটি বিকল্প:
বিকল্প 1 - আপনার নির্মাণকারীর দুর্নীতি
ধরে নেওয়া যাক আপনি সূচক (...) কে ওভাররাইড করছেন, এবং পুরো সংগ্রহটি পুনরাবৃত্তি করে নিজেকে বাঁচাতে আপনি কেবল পারফরম্যান্সের জন্য টাইপটি পরীক্ষা করতে চান।
এই মত একটি নোংরা নির্মাণকারী করুন:
public MyCollection<T>(Class<T> t) {
this.t = t;
}
তারপরে আপনি টাইপটি পরীক্ষা করতে isignableFrom ব্যবহার করতে পারেন ।
public int indexOf(Object o) {
if (
o != null &&
!t.isAssignableFrom(o.getClass())
) return -1;
//...
প্রতিবার আপনি যখন নিজের অবজেক্টটি ইনস্ট্যান্ট করবেন তখন আপনাকে নিজের পুনরাবৃত্তি করতে হবে:
new MyCollection<Apples>(Apples.class);
আপনি সিদ্ধান্ত নিতে পারেন এটি উপযুক্ত নয়। অ্যারেলিস্ট.ইন্ডেক্সঅফ (...) এর বাস্তবায়নে , তারা পরীক্ষা করে না যে টাইপটি মেলে।
বিকল্প 2 - এটি ব্যর্থ হতে দিন
যদি আপনাকে এমন একটি বিমূর্ত পদ্ধতি ব্যবহার করতে হয় যার জন্য আপনার অজানা প্রকারের প্রয়োজন হয়, তবে আপনি যা চান তা হ'ল কম্পাইলারটি উদাহরণস্বরূপ কান্নাকাটি বন্ধ করে দেবে । আপনার যদি এই জাতীয় পদ্ধতি থাকে:
protected abstract void abstractMethod(T element);
আপনি এটি এর মতো ব্যবহার করতে পারেন:
public int indexOf(Object o) {
try {
abstractMethod((T) o);
} catch (ClassCastException e) {
//...
আপনি কেবলমাত্র সংকলককে বোকা বানানোর জন্য অবজেক্টটিকে টি (আপনার জেনেরিক প্রকার) এ কাস্ট করছেন। আপনার কাস্ট রানটাইমের সময় কিছুই করেনা , তবে আপনি যখন আপনার বিমূর্ত পদ্ধতিতে ভুল ধরণের অবজেক্টটি পাস করার চেষ্টা করবেন তখনও আপনি ক্লাসকাস্টেক্সেপশন পাবেন।
দ্রষ্টব্য 1: আপনি যদি আপনার বিমূর্ত পদ্ধতিতে অতিরিক্ত চেক না করা ক্যাসেটগুলি করছেন তবে আপনার ক্লাসকাস্টএক্সেপশনগুলি এখানে ধরা পড়বে। এটি ভাল বা খারাপ হতে পারে, তাই এটির মাধ্যমে চিন্তা করুন।
দ্রষ্টব্য 2: আপনি উদাহরণ ব্যবহার করার সময় একটি নিখুঁত নাল চেক পাবেন । যেহেতু আপনি এটি ব্যবহার করতে পারবেন না, আপনার খালি হাতে নাল পরীক্ষা করার প্রয়োজন হতে পারে।
Class.isAssignableFrom
।