জেনেরিকস (Generics)
জেনেরিকস আসলে কোন সমস্যার সমাধান করে (The Problem Generics Solve)
কল্পনা করুন আপনি চমৎকার একটি গিফট বক্স বা বাক্স বানিয়েছেন। একদিন আপনি এর ভেতর একটা বই রাখলেন, আরেকদিন একটা খেলনা, আর অন্য দিন কিছু চকলেট। জেনেরিকস (generics) না থাকলে, জাভা সব ধরনের বাক্সকেই একেই চোখে দেখত — আপনি বাক্সের ভেতরে যাই রাখুন না কেন তা একটি Object হিসেবে বিবেচিত হতো এবং বাক্স থেকে কিছু বের করার সময় আপনাকে অনুমান করে নিতে হতো যে ভেতরে আসলে কী আছে। এটি বেশ ঝামেলার এবং ভুল হওয়ারও একটি বড় কারণ।
জেনেরিকস (Generics) আপনাকে নির্দিষ্ট ধরনের বাক্স তৈরি করতে এবং বলে দিতে সাহায্য করে: "এই বাক্সটি শুধুমাত্র বই রাখার জন্য।" এখন জাভা খুব ভালো করেই জানে এর ভেতরে ঠিক কী আছে, কোনো ভুল হলে সে নিজেই কোড কম্পাইল হওয়ার সময়েই (compile time) সেটি ধরে ফেলে এবং আপনাকে আর কখনোই অনুমান করে নিতে হয় না।
আপনি নিজের অজান্তেই হয়তো এর মধ্যেই জেনেরিকস ব্যবহার করে ফেলেছেন! ArrayList<String> মূলত একটি জেনেরিক ArrayList যা কেবল স্ট্রিং (String) টাইপের ডেটা ধারণ করে। এখানের <String> অংশটিই হলো টাইপ প্যারামিটার (type parameter)।
একটি জেনেরিক ক্লাস তৈরি করা (Creating a Generic Class)
জেনেরিক মেথড এবং বাউন্ডেড টাইপ (Generic Methods & Bounded Types)
আপনাকে পুরো ক্লাসটিকেই জেনেরিক হতে হবে, এমন কোনো কথা নেই — আপনি চাইলে আলাদা আলাদা মেথডকেও (individual methods) জেনেরিক করতে পারেন। শুধু রিটার্ন টাইপের ঠিক আগে টাইপ প্যারামিটারটি বসিয়ে দিন।
বাউন্ডেড টাইপগুলো (Bounded types) আপনাকে ঠিক কোন কোন টাইপ ব্যবহার করা যাবে, তার একটা সীমানা ঠিক করে দেওয়ার সুযোগ দেয়। যেমন <T extends Number> এর মানে হলো "T এর জায়গার যেকোনো Integer, Double, Float ইত্যাদি বসতে পারে — অর্থাৎ এমন সবকিছু যা মূলত একেকটি নম্বর (Number)।" এই সুবিধাটি আপনাকে জেনেরিক কোডের ভেতরে নম্বর বা Number ক্লাসের বিভিন্ন মেথড, যেমন .doubleValue() ইত্যাদি ব্যবহার করার সুযোগ দেয়।
যখন আপনি "যেকোনো টাইপের" মান গ্রহণ করতে চান কিন্তু সেটির নাম উল্লেখ করার কোনো প্রয়োজন নেই, তখন ওয়াইল্ডকার্ড (Wildcards) (?) ব্যবহার করা হয়। List<?> এর মানে হলো "যে কোনো কিছুর একটি তালিকা বা লিস্ট।" আবার List<? extends Number> এর মানে হলো "যেকোনো ধরনের নম্বর বা Number টাইপের একটি তালিকা।"
জেনেরিক মেথড (Generic Methods)
মাল্টিপল টাইপ প্যারামিটারসহ জেনেরিক ক্লাস (Generic Class with Multiple Type Parameters)
Box<String> পরিণত হয় স্রেফ Box-এ। আর এ কারণেই আপনি চাইলেও new T() বা T[] arr = new T[10] এমন কিছু করতে পারবেন না — কারণ জাভা রানটাইমে এসে বুঝতেই পারে না যে এই T জিনিসটা আসলে কী!