/ / Java Generics: الوصف والطرق

جافا جينيريكس: الوصف والطرق

منذ شهدت جدا من لغة جافاالكثير من التغييرات ، والتي ، مما لا شك فيه ، جلب لحظات إيجابية لوظائفها. أحد هذه التغييرات ذات المغزى هو إدخال Java Generic أو التعميم. جعلت هذه الوظيفة اللغة ليست فقط أكثر مرونة وتنوعا ، ولكن أيضا أكثر أمانا من حيث الحد من أنواع البيانات.

جاوة ادوات وصف

والحقيقة هي أنه قبل إدخال عام عاميمكن إنشاء الكود في Java فقط بالرجوع إلى نوع الكائن. يمكن تعيين هذه الروابط لأي كائن. بعد كل شيء ، جميع الطبقات في جافا هي أحفاد ضمني من فئة كائن. ومع ذلك ، يعد هذا الأسلوب مصدرًا محتملاً للعديد من أخطاء الأمان عند تحويل كائن من الكائن إلى نوع الهدف بشكل صريح. عند استخدام التعميمات ، يتم تنفيذ جميع القوالب ضمنيًا وتلقائيًا ، مما يستبعد حتى احتمال حدوث أخطاء.

Java Generics: الوصف والمثال

لنأخذ مثالاً بسيطًا لتطبيق التعميم على الطبقة المعتادة في الشكل أدناه. وعندها فقط سنشرع في فحص مفصل لجميع التفاصيل الدقيقة والفوارق الدقيقة في Java Generic.

الطبقة العامة جافا

لاحظ كيفإقران إعلان الصف. بعد اسم الفئة مباشرةً ، يتم فتح الأقواس المربعة التي يشار فيها بالحرف T. وهو نوع من العناصر النائبة التي سيتم استبدالها بنوع معين عند إنشاء مثيل لهذا الفصل. يبدو مثل هذا: Pair <Integer> obj = new Pair <Integer> (). تجدر الإشارة إلى أنه بدلاً من T ، يمكنك تحديد أي حرف ، ولكن ، كقاعدة ، استخدم T أو V أو E.

ملاحظة: بدءًا من الإصدار الثامن من Java ، مع تحديد نوع الهدف عند الإعلان عن الارتباط ، يمكنك ترك قوسين معقوفين في المنشئ فارغًا. لذلك يمكن إعادة كتابة المثال أعلاه كما يلي: Pair <Integer> obj = new Pair <> ().

عندما يتم الإعلان عن فئة بهذه الطريقة ، ثم فييمكنك استخدام هذا الحرف بدلاً من أنواع الحقول المحددة والمراجع والأساليب التي يتم إرجاعها بواسطة الطرق. لأنه يتم استبدال T بنوع محدد عند إنشاء كائن فئة ، سيكون الحقلان الأول والثاني في هذه الحالة من النوع Integer.

بعد المنطق ، فإن الحجج الأولى البند والثاني البند ،تم تمريره إلى المُنشئ المناظر ، كما يجب أن يكون من النوع Integer أو الفئة الفرعية الخاصة به. إذا حاولت تمرير نوع بيانات مختلف عن ما تم تحديده عند إنشاء الكائن ، فلن يتخطى المحول البرمجي هذا الخطأ. لذلك ، سيكون لدى المُنشئ الذي يحتوي على الوسيطات عند تكوين الكائن النموذج التالي: Pair <Integer> obj = new Pair <> (Integer جديد (1) ، عدد صحيح جديد (2)). وينطبق الشيء نفسه على الوسيطتين إلى طريقتين setFirst و setSecond. و كما قد تكون قد خمنت بالفعل ، فإن أساليب getFirst و getSecond ستعطي قيم من النوع Integer.

فئة عامة مع العديد من معلمات النوع

في الفئات العامة ، يمكنك أيضًا الإعلان عن عدة معلمات نوع محددة في أقواس زاوية مفصولة بفواصل. يتم عرض فئة الزوج لهذه الحالة في الشكل أدناه.

جافا عام

كما ترون ، عند إنشاء مثيل لمثل هذه الفئةفي أقواس الزاوية ، يجب عليك تحديد نفس العدد من أنواع المعلمات. إذا كنت معتادًا على هذا النوع من بنية البيانات كخريطة ، فقد تلاحظ أن نفس المبدأ مستخدم هناك. هناك الوسيطة الأولى تحدد نوع المفتاح ، والثانية - نوع القيمة. تجدر الإشارة إلى أن أنواع الوسائط التي تم تمريرها إلى إنشاء الكائن يمكن أن تكون هي نفسها. إذن ، التصريح التالي لمثيل من فئة الزوج صحيح تمامًا: Pair <String، String> obj.

بعض ميزات التعميمات

قبل المضي قدما ، وتجدر الإشارة إلى أنهلا يقوم برنامج التحويل البرمجي Java بإنشاء أي إصدارات مختلفة من فئة الزوج. في الواقع ، أثناء عملية التحويل البرمجي ، يتم حذف جميع المعلومات حول النوع العام. بدلاً من ذلك ، يتم إرسال الأنواع المطابقة ، وإنشاء نسخة خاصة من فئة الزوج. ومع ذلك ، فإن البرنامج نفسه لا يزال لديه نسخة عامة واحدة من هذه الفئة. تسمى هذه العملية بتنظيف Java Generic type.

دعونا نلاحظ نقطة مهمة. لا تشير الإشارات إلى إصدارات مختلفة من نفس فئة جافا العامة إلى نفس الكائن. بمعنى ، لنفترض أننا لدينا رابطان: Pair <Integer> obj1 و Pair <Double> obj2. لذلك ، يحدث خطأ في السطر obj1 = obj2. على الرغم من أن كلا المتغيرين من النوع الزوج <T> ، فإن الكائنات التي تشير إليها مختلفة. هذا مثال حي على أمان الأنواع في Java Generic.

القيود المفروضة على الطبقات المعممة

من المهم معرفة أنه يمكن تطبيق التعميماتفقط إلى أنواع المرجع ، أي ، يجب أن تكون الوسيطة التي تم تمريرها إلى الوسيطة java class للمعلمة العامة من نوع الفئة. مثل هذه الأنواع البسيطة ، على سبيل المثال ، مزدوجة أو طويلة ، لا يمكن نقلها. بمعنى آخر ، السطر التالي من تعريف فئة الزوج غير صالح: Pair <int> obj. ومع ذلك ، لا يمثل هذا القيد مشكلة خطيرة ، لأن Java تحتوي على فئة ملحقة مطابقة لكل نوع بدائي. بالمعنى الدقيق للكلمة ، إذا كنت ترغب في تغليف عدد صحيح وقيمة منطقية في فئة الزوج ، فستقوم الحزمة التلقائية بكل شيء من أجلك: Pair <Integer، Boolean> obj = new Pair <> (25، true).

قيود اخرى خطيرة هياستحالة إنشاء مثيل لمعلمة نوع. لذلك ، سيتسبب السطر التالي في خطأ ترجمة: T أولاً = new T (). هذا واضح ، لأنك لا تعرف مسبقا ما إذا كان سيتم تمرير فئة كاملة أو واجهة مجردة كوسيطة. وينطبق نفس الشيء على إنشاء المصفوفات.

أنواع محدودة

في كثير من الأحيان هناك حالات عندمامن الضروري تحديد قائمة الأنواع التي يمكن تمريرها كوسيطة لفئة جافا العامة. لنفترض أنه في صف الزوج لدينا نريد أن نحصر القيم العددية حصريا لعمليات حسابية أخرى عليها. للقيام بذلك ، نحتاج إلى تعيين الحد العلوي لمعلمة النوع. يتم تنفيذ ذلك باستخدام تعريف فئة مميزة تم توارثه بواسطة كل الوسائط التي تم تمريرها بين أقواس زاوية. سيبدو هذا: class Pair <T يمتد Number>. بهذه الطريقة ، يتعلم المحول البرمجي أنه بدلاً من المعلمة T ، يمكنك استبدال إما فئة الرقم أو واحدة من الفئات الفرعية الخاصة به.

هذه تقنية شائعة. غالباً ما يتم استخدام هذه القيود لضمان توافق معلمات النوع في نفس الفئة. لنأخذ مثالاً على صف الزوج: الفئة الزوج <T ، V يمتد T>. هنا نقول لل مترجم أن نوع T يمكن أن يكون تعسفيا ، ونوع V يجب أن يكون إما نوع T أو واحدة من الفئات الفرعية الخاصة به.

يحدث التقييد "من الأسفل" تمامًاالصورة ، ولكن بدلاً من الكلمة تمتد ، تتم كتابة الكلمة السوبر. بمعنى ، يشير تعريف فئة Pair <T super ArrayList> إلى أنه بدلاً من T ، يمكن استبدال إما ArrayList أو أي فئة أو واجهة يرثها.

أساليب Java عام والمصنعون

في جافا التعميمات يمكن تطبيقها ليس فقط فيما يتعلق بالفصول ، ولكن أيضا الأساليب. لذا ، يمكن تعريف الطريقة المعممة في الطبقة العادية.

طرق جافا العامة

كما ترون في الشكل أعلاه ، لا يوجد شيء معقد في إعلان الطريقة المعممة. يكفي وضع أقواس زاوية قبل طريقة نوع الإرجاع وتحديد معلمات النوع فيها.

في حالة منشئ ، يتم كل شيء بنفس الطريقة:

جافا نوع تنظيف عام

يتم وضع أقواس الزاوية في هذه الحالة قبل اسم المُنشئ ، حيث إنها لا تعرض أي قيمة. ستكون نتيجة عمل كلا البرنامجين:

عدد صحيح

سلسلة

</ p>>
اقرأ المزيد: