1. المفهوم الأساسي للذهل الأولي
مثل C#، Java لديه مفهوم الأداء والمعلمة الأنواع. تظهر الأدوية الجيرية في Java بعد JDK5.0 ، ولكن الأدوية الجيرية في Java تختلف اختلافًا أساسيًا عن الأدوية الجيرية في C#. بادئ ذي بدء ، من منظور أنواع المجموعات ، ArrayList <integer> و ArrayList <string> في Java هما نفس النوع. سيتم إجراء محو النوع أثناء التجميع ، والأنواع في Java هي علم الأوعية الدموية. سيتم تقديم علم الأوعية الدموية في وقت لاحق. ثانياً ، عند إضافة أنواع أساسية من البيانات إلى مجموعة ، مثل int ، سيتم تحويل Int أولاً إلى كائن عدد صحيح ، وهو ما نسميه عادة عملية الملاكمة. عند إخراج العناصر ، يجب تحويل كائن interger إلى نوع قيمة int ، أي عملية إلغاء التفسير. في C#، القائمة <int> وقائمة <string> أنواع مختلفة. ستكون المعلمات العامة عنصرًا نائبًا بعد التجميع ولا يتم محوها. يتم تعيين أنواع حقيقية في وقت التشغيل. يتم إنشاؤها أثناء وقت تشغيل النظام ولديها جداول الطريقة الافتراضية الخاصة بها وبيانات الكتابة. يسمى هذا التنفيذ تضخم النوع (لتضخم النوع ، قام المترجم الفوري بالكثير من أعمال التحسين لحل هذه المشكلة). هذا هو ما يسمى الأدوية الحقيقية. في الوقت نفسه ، عند إضافة عناصر أساسية مثل int إلى مجموعة ، ليست هناك حاجة إلى المربع ، ولا يلزم إلغاء التزامن عند إخراج العناصر. لذلك ، الأداء أفضل من جافا مجموعة الأدوية.
إن إدخال الأدوية الجيرية في Java هو حل مشكلتين: 1. تحدث استثناءات استبدال النوع أثناء وقت تشغيل عنصر نوع المجموعة ، وإضافة عمليات فحص النوع أثناء نوع الترجمة. 2. كرر كتابة الكود أثناء الحل ، ويمكن إعادة استخدام الخوارزمية. فيما يلي مثال لتوضيح نوع التحقق من المترجم.
أولاً ، دعونا نلقي نظرة على مثال لا يتم فيه استخدام الأدوية الجنيسة:
ArrayList al = new ArrayList () ؛ al.add ("ABC") ؛ al.add ("124") ؛ al.add ("32L") ؛يمكننا إضافة أي نوع من البيانات إلى مجموعة AL. عندما نحتاج إلى تحويل النوع عند جلب البيانات ، مثل:
سلسلة s = (سلسلة) al.get (0) ؛ السلسلة s1 = (سلسلة) al.get (1) ؛ // في فترة التشغيل ، سيتم الإبلاغ عن خطأ وسيكون خطأ تحويل النوع L = (طويل) al.get (2) ؛
من هذا يمكننا أن نرى أنه عندما لا يكون هناك جماهير ، يتم تقليل فحص النوع أثناء التجميع. عند إخراج العناصر ، يحتاج المبرمجون إلى معرفة أنواع كل عنصر ، وإلا فقد يحدث استثناء من تحويل النوع في وقت التشغيل.
لذلك دعونا نلقي نظرة على الفوائد التي يجلبها لنا من خلال مجموعات عامة.
ArrayList <string> al1 = new ArrayList <String> () ؛ al1.Add ("ABC") ؛ al1.add (1) ؛ // حدث خطأ أثناء التجميع ،عندما نؤسس AL1 مع نوع المعلمة السلسلة ، لا يمكننا إضافة عنصر int ، وإلا فإن المترجم سيقوم بالإبلاغ عن خطأ. عادة ، ستكون هناك علامة خطأ في محرر IDE ، مثل Eclipse. في الوقت نفسه ، ليست هناك حاجة إلى كتابة التحويل عند استخراج العنصر.
قيمة السلسلة = al1.get (0) ؛ // لا يلزم تحويل النوع
هذا هو فائدة الأدوية الجيلية.
ثم ينعكس تعدد الإرسال للخوارزميات بشكل أساسي في تعدد الإرسال للطرق ، مثل طريقة ADD لقائمة ArrayList ، والتي يمكن استخدامها على أي نوع أو نوع محدود.
2. استخدام الأدوية الجيلية
تستخدم الأدوية في Java بشكل أساسي في الفصول والأساليب والواجهات. أولاً ، دعونا نلقي نظرة موجزة على استخدام الفصل:
Class Factory <T> {private t value ؛ العام t getValue () {return value ؛ } public void setValue (t v) {this.value = v ؛ }}إضافة طريقة الاختبار:
المصنع <string> f = مصنع جديد <string> () ؛ F.SetValue ("المصنع قيد الاستخدام") ؛ system.out.println (f.getValue ()) ؛استخدام واجهات عامة:
واجهة myInterface <t ، u> {void show (t t ، u u) ؛ } class showtest تنفذ myInterface <string ، integer> {Override public void show (string t ، integer u) {system.out.println (t) ؛ System.out.println (u) ؛ }}عندما تعمل معلمة النوع العام على الفصل ، فإنها تقيد بشكل أساسي قيود النوع بين الحقول المتعددة وتوقيعات الطريقة. عند التصرف على طريقة ما ، يتم إجراء القيود الرئيسية على معلمات متعددة من الطريقة. هنا ، لن يتم إعطاء معلمات النوع العام للطريقة أمثلة. دعونا نقدم بشكل أساسي قيود المعلمات النوع أدناه.
3. اكتب قيود المعلمة
دعونا نلقي نظرة على مثال صغير ، كما هو موضح في الكود التالي:
static public <T> t get (t t1 ، t t2) {if (t1.compareto (t2)> = 0) ؛ // خطأ في التجميع ، فإن طريقة المقارنة (t) غير محددة للنوع t. return t1 ؛ }يمكنك رؤية رسالة خطأ المترجم. لا يتم تعريف طريقة المقارنة بالنسبة للنوع T. إذا كان من الضروري مقارنة الأنواع في Java ، فيجب تنفيذ الواجهة المماثلة ، بحيث يتم تجاوز الطريقة. ثم نقوم بإجراء التعديلات التالية:
الثابت العام <t يمتد قابلة للمقارنة> t (t t1 ، t t2) {// إضافة قيود النوع if (t1.compareto (t2)> = 0) ؛ إرجاع T1 ؛ }من خلال تأهيل t يمتد قابلاً للمقارنة ، فإنه يوضح أن T هو نوع الواجهة التي تنفذ قابلة للمقارنة ، وبالتالي تنفذ أيضًا طريقة المقارنة ، لذلك لن تكون هناك أخطاء في وقت الترجمة.
عندما نستخدم ونقسم قيودًا متعددة لأنواع ، يمكننا استخدام الكلمات الرئيسية المحدودة ونقسمها ، ويمكن استخدام تمديد فقط. في الوقت نفسه ، عند وجود كل من الواجهات والأنواع ، لا يمكن وضع الفصل أولاً ويمكن أن يكون له سوى واحد ، كما هو موضح أدناه:
<t يمتد الكائن والمقارنة والقابلة للتسلسل>
تناقش المقالة أعلاه باختصار دور ومفاهيم Java Generics الأساسية هي كل المحتوى الذي أشاركه معك. آمل أن تتمكن من إعطائك مرجعًا وآمل أن تتمكن من دعم wulin.com أكثر.