جنریک ها (Generics)
«جنریک ها (Generics)» یعنی نوشتن کد قابل استفاده برای چند «نوع (Type)». این کار، خطاهای زمانِ ساخت (compile-time) را کم می کند. همچنین، کد تمیزتر می شود و نیاز به «کست (Cast)» کمتر می شود.
چرا جنریک ها مهم اند؟
- کد تکراری کمتر می نویسی؛ فقط یک بار می سازی.
- ایمنی نوع (Type Safety) بیشتر می شود و زودتر خطا می بینی.
- کد خواناتر می شود و دیگر زیاد کست نمی کنی.
نکته: «نوع پارامتری (Type Parameter)» مثل حرف T، فقط «جای خالیِ نوع» است.
کلاس جنریک: Box<T>
اینجا T یک «جای خالیِ نوع» است. می تواند String باشد یا Integer. مثل کیف چندمنظوره در مدرسه.
class Box<T> {
T value;
void set(T value) {
this.value = value;
}
T get() {
return value;
}
}
public class Main {
public static void main(String[] args) {
Box<String> stringBox = new Box<>();
stringBox.set("Hello");
System.out.println("Value: " + stringBox.get());
Box<Integer> intBox = new Box<>();
intBox.set(50);
System.out.println("Value: " + intBox.get());
}
}
گام های تمرینی
- Box<Double> بساز و مقدار 3.14 را بگذار.
- متد get را صدا بزن و چاپ کن.
- برای Box<Boolean> هم تکرار کن.
متد جنریک: printArray<T>
«متد جنریک (Generic Method)» با هر نوعی کار می کند. مثل قانون کلی برای همه کلاس ها.
public class Main {
public static <T> void printArray(T[] array) {
for (T item : array) {
System.out.println(item);
}
}
public static void main(String[] args) {
String[] names = {"Jenny", "Liam"};
Integer[] numbers = {1, 2, 3};
printArray(names);
printArray(numbers);
}
}
نوع های محدودشده (Bounded Types)
با extends می گوییم T فقط عددی باشد. مثل قانون: «فقط شاگردان ریاضی».
class Stats<T extends Number> {
T[] nums;
Stats(T[] nums) {
this.nums = nums;
}
double average() {
double sum = 0;
for (T num : nums) {
sum += num.doubleValue();
}
return sum / nums.length;
}
}
public class Main {
public static void main(String[] args) {
Integer[] intNums = {10, 20, 30, 40};
Stats<Integer> intStats = new Stats<>(intNums);
System.out.println("Integer average: " + intStats.average());
Double[] doubleNums = {1.5, 2.5, 3.5};
Stats<Double> doubleStats = new Stats<>(doubleNums);
System.out.println("Double average: " + doubleStats.average());
}
}
جنریک در کالکشن ها (Collections)
کالکشن (Collection) هایی مثل ArrayList با جنریک ها امن تر می شوند. دیگر کستِ خطرناک نمی کنی.
import java.util.ArrayList;
public class Main {
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<>();
list.add("Apple");
String fruit = list.get(0);
System.out.println(fruit);
}
}
نکته: برای مرور سریع «جنریک ها در جاوا»، این صفحه را ذخیره کن.
برای آشنایی با کلاس های بسته بندی و ادامه مسیر، سرِ Annotationها هم بزن.
جمع بندی سریع
- جنریک ها کد را امن و قابل استفاده مجدد می کنند.
- T یعنی «نوعِ ناشناخته فعلاً». بعداً مشخص می شود.
- متد جنریک با هر نوعی کار می کند.
- با extends می توان نوع ها را محدود کرد.
- کالکشن ها با جنریک ها بی نیاز از کست می شوند.