لماذا Generics؟
تتيح كتابة كود يعمل مع أي نوع مع الحفاظ على أمان النوع (يكشف الأخطاء وقت الترجمة).
رأيتها بالفعل: ArrayList<String> و HashMap<String, Integer>.
صنف عام
public class Box<T> {
private T value;
public void set(T value) { this.value = value; }
public T get() { return value; }
}
الاستخدام:
Box<String> b1 = new Box<>();
b1.set("مرحبًا");
String s = b1.get(); // بلا تحويل، آمن
Box<Integer> b2 = new Box<>();
b2.set(42);
دالة عامّة
public static <T> void printArray(T[] arr) {
for (T item : arr) {
System.out.println(item);
}
}
الحدود (Bounded)
تقييد النوع:
public static <T extends Number> double sum(T a, T b) {
return a.doubleValue() + b.doubleValue();
}
الفائدة
- أمان النوع: خطأ النوع يُكشف وقت الترجمة لا التشغيل.
- إعادة الاستخدام: كود واحد لكل الأنواع.
- بلا تحويل (casting): المترجم يعرف النوع.
🎯 التالي: التعبيرات اللامية والبرمجة الدالية.