تخطَّ إلى المحتوى

Generics

الأنواع العامّة Generics Generics

Generics تتيح كتابة أصناف ودوال تعمل مع أي نوع مع الحفاظ على أمان النوع وقت الترجمة.

بدون generics، الأنواع تُخزّن كـ Object ويجب تحويلها يدويًا (casting) — خطأ Tipo يظهر وقت التشغيل فقط. مع generics، المترجم يعرف النوع ويكشف الأخطاء وقت الترجمة. تُستخدم بكثرة في ArrayList<T> و HashMap<K,V> والدوال العامة.

الصياغة

class Box<T> {
    T value;
    void set(T value) { this.value = value; }
    T get() { return value; }
}

<T> T first(T[] arr) { return arr[0]; }

📄 مثال

Box<String> sb = new Box<>();
sb.set("مرحبًا");
String s = sb.get(); // بلا casting

Box<Integer> ib = new Box<>();
ib.set(42);
int n = ib.get();    // auto-unboxing

// خطأ ترجمة:
// ib.set("نص"); // incompatible types

أهم النقاط

العنصرالوظيفة
<T>معامل نوع عام — يُستبدل بالنوع الفعلي عند الاستخدام
<T extends X>نوع مقيّد — يجب أن يكون X أو صنف مشتق
<T, U>عدة أنواع عامة
diamond <>Java 7+: يستنتج النوع تلقائيًا: new Box<>()

💡 نصائح عملية

  • استخدم generics دائمًا مع المجموعات — تمنع أخطاء النوع وقت التشغيل
  • T و E و K و V أسماء ت convention: T=Type, E=Element, K=Key, V=Value

⚠️ أخطاء شائعة

  • nxing raw type: Box b = new Box(); بلا generics — يفقد أمان النوع
  • nxing wildcard بشكل غير ضروري: List<?> بدل List<String> — يُضعف وضوح الكود

خصائص ذات صلة

🎓 تريد فهم الصورة الكاملة خطوة بخطوة؟ ابدأ من مسار JAVA الكامل بالعربي.