1. فهم بسيط للأدوية
تعتبر الأدوية العامة ميزة جديدة في Java SE 1.5. جوهر الأدوية العامة هو نوع ذو معلمات، مما يعني أن نوع البيانات الذي يتم تشغيله عليه محدد كمعلمة. النقطة الشائعة هي "نوع المتغير". يمكن استخدام المتغيرات من هذا النوع في إنشاء الفئات والواجهات والأساليب.
أسهل طريقة لفهم أدوية Java العامة هي التفكير فيها باعتبارها صيغة ملائمة توفر عليك بعض عمليات إرسال Java:
انسخ الكود كما يلي: List<Apple> box = new ArrayList<Apple>();box.add(new Apple());Apple apple =box.get(0);
يعبر الكود أعلاه عن نفسه بشكل واضح للغاية: box عبارة عن قائمة تحتوي على كائنات Apple. يقوم الأسلوب get بإرجاع مثيل كائن Apple، ولا يلزم تحويل النوع في هذه العملية. بدون الأدوية العامة، يجب كتابة الكود أعلاه على النحو التالي:
انسخ الكود كما يلي: Apple apple = (Apple)box.get(0);
2. إحراج الأدوية الجنيسة
أكبر ميزة للأدوية العامة هي أنها توفر أمانًا لنوع البرنامج ومتوافقة مع الإصدارات السابقة، ولكنها تحتوي أيضًا على نقطة غريبة، وهي أنه يجب تحديد نوع الأدوية العامة في كل مرة يتم تعريفها لتحديده بشكل صريح، ولكن أيضًا الكثير من المبرمجين ليسوا على دراية بالأدوية العامة، لذلك غالبًا ما يكونون غير قادرين على توفير معلمات النوع الصحيحة. الآن يمكن للمترجم أن يستنتج تلقائيًا أنواع معلمات الأدوية العامة، مما قد يقلل من مثل هذه المواقف ويحسن التعليمات البرمجية سهولة القراءة.
3. تحسينات في استنتاج النوع العام في Java 7
في الإصدارات السابقة، عند استخدام الأنواع العامة، تحتاج إلى إضافة النوع العام على كلا الجانبين عند الإعلان عن القيم وتعيينها. على سبيل المثال:
انسخ الكود كما يلي: Map<String, String> myMap = new HashMap<String, String>();
قد تعتقد: لقد قمت بالفعل بتحديد نوع المعلمة عند الإعلان عن المتغير، فلماذا أحتاج إلى تحديده مرة أخرى عند تهيئة الكائن؟ لحسن الحظ، تم تحسين هذه الطريقة في Java SE 7، ويمكنك الآن إعلان القيم وتعيينها باستخدام العبارات التالية:
انسخ الكود كما يلي: Map<String, String> myMap = new HashMap<>(); // انتبه إلى "<>" في النهاية
في هذا البيان، سيستنتج المترجم تلقائيًا النوع العام عند إنشاء مثيل HashMap بناءً على النوع العام عند الإعلان عن المتغير. مرة أخرى، تأكد من الانتباه إلى "<>" بعد HashMap الجديد. فقط إضافة هذا "<>" يعني الاستدلال التلقائي للنوع. وإلا، فهو نوع HashMap غير عام، وسيتم تقديمه عند استخدام المترجم تجميع التعليمات البرمجية المصدر. ملاحظة تحذيرية.
ومع ذلك: يكون استنتاج نوع Java SE 7 عند إنشاء مثيلات عامة محدودًا: فقط إذا تم الإعلان عن نوع المعلمات للمنشئ بشكل صريح في السياق، فيمكن استخدام استنتاج النوع، وإلا فلن يعمل. على سبيل المثال: لا يمكن تجميع المثال التالي بشكل صحيح في Java 7 (ولكن يمكن تجميعه في Java 8 الآن، لأنه يتم استنتاج نوع العام تلقائيًا بناءً على معلمات الطريقة):
انسخ رمز الكود كما يلي:
List<String> list = new ArrayList<>();
list.add("A");// بما أن addAll تتوقع معلمة من النوع Collection<? Extends String>، فلا يمكن تمرير العبارة التالية
list.addAll(new ArrayList<>());
4. تحسينات في استنتاج النوع العام في Java 8
هناك نوعان رئيسيان لاستدلال النوع المستهدف للأدوية العامة في Java 8:
1. دعم استنتاج أنواع الأهداف العامة من خلال سياق الطريقة
2. يدعم تمرير استنتاج النوع العام إلى الطريقة الأخيرة في سلسلة استدعاء الطريقة.
دعونا نلقي نظرة على مثال من الموقع الرسمي:
انسخ رمز الكود كما يلي:
قائمة الفئة<E> {
قائمة <Z> ثابتة <Z> nil() { ... };
قائمة <Z> ثابتة <Z> سلبيات (Z head، List <Z> tail) { ... }؛
الرأس الإلكتروني () { ... }
}
وفقًا لخصائص JEP101، يمكننا الكتابة بهذه الطريقة عند استدعاء الطريقة المذكورة أعلاه
انسخ رمز الكود كما يلي:
// استنتج تلقائيًا نوع النوع العام من خلال المعلمة الهدف لتعيين الطريقة
List<String> l = List.nil();
// بدلاً من النوع المحدد المعروض
//List<String> l = List.<String>nil();
// استنتج النوع العام من خلال نوع معلمة الطريقة السابقة
List.cons(42, List.nil());
// بدلاً من النوع المحدد المعروض
//List.cons(42, List.<Integer>nil());
5. ملخص
ما ورد أعلاه هو محتوى ميزات JEP101، كممثل للغات الثابتة، يمكن القول أن Java لديها نظام من النوع الغني. مشكلة التحويل بين الأنواع تزعج كل مبرمجي Java. يمكن أن يؤدي استنتاج الأنواع تلقائيًا من خلال المترجم إلى تخفيف مشكلة تحويل النوع المعقد للغاية. على الرغم من أنه تحسن بسيط، إلا أنه سيكون له بالتأكيد تأثير كبير على مبرمجينا الذين يكتبون التعليمات البرمجية كل يوم، على الأقل سيشعرون بسعادة أكبر ~~ ربما في Java 9، سنحصل على نوع عالمي var، مثل js أو بعض اللغات الديناميكية. من سكالا هي من هذا القبيل ^ _ ^