"إذا أراد العامل أن يؤدي عمله بشكل جيد، فعليه أولاً أن يشحذ أدواته." - كونفوشيوس، "مختارات كونفوشيوس. لو لينجونج"
الصفحة الأمامية > برمجة > لماذا لا يمكنني إضافة عناصر إلى مجموعة Java باستخدام نوع Wildcard العام (`؟ يمتد الأصل`)؟

لماذا لا يمكنني إضافة عناصر إلى مجموعة Java باستخدام نوع Wildcard العام (`؟ يمتد الأصل`)؟

تم النشر بتاريخ 2024-12-17
تصفح:522

Why Can't I Add Elements to a Java Collection with a Wildcard Generic Type (`? extends Parent`)?

سلامة النوع وأسماء البدل العامة: فهم المُعدِّل المحظور

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

ضع في اعتبارك مقتطف التعليمات البرمجية التالي:

List extends Parent> list = ...;
Parent p = factory.get(); // returns concrete implementation
list.set(0, p); // fails here: set(int, ? extends Parent) cannot be applied to (int, Parent)

لماذا فشل تجميع هذا الرمز؟ تكمن الإجابة في آليات الأمان المتأصلة التي يتم فرضها بواسطة أحرف البدل العامة.

مبدأ الاسترجاع غير المقيد والإضافة المقيدة

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

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

ضع في اعتبارك السيناريو التالي:

List childList = new ArrayList();
childList.add(new Child());

List extends Parent> parentList = childList;
parentList.set(0, new Parent());

Child child = childList.get(0); // No! It's not a child! Type safety is broken...

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

ضمان سلامة النوع غير القابل للتغيير

من خلال حظر إضافة القيم إلى مجموعات أحرف البدل العامة، تفرض Java أمانًا غير قابل للتغيير. وهذا يضمن أن عناصر القائمة تلتزم دائمًا بالقيود التي يفرضها نوعها المعلن.

في غياب هذا القيد، سيتم اختراق أمان النوع، مما يؤدي إلى أخطاء محتملة وسلوك غير متوقع.

أحدث البرنامج التعليمي أكثر>

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

Copyright© 2022 湘ICP备2022001581号-3