السلام عليكم ياريت حد يشوفلى اجابة السوالين دة صح دة لاغلط ؟
url=http://www.7kawiclub.com/up]
*****************************
السلام عليكم ياريت حد يشوفلى اجابة السوالين دة صح دة لاغلط ؟
url=http://www.7kawiclub.com/up]
*****************************
WWW.ITeShare.com
WWW.ITeShare.net
WWW.ITeShare.info
؟؟؟؟؟؟
من وين جبت هالسؤالين ؟
في الأول أحب اوضح ان معلوماتي في ال generic لا تتعدى ال 24 ساعة الماضية فأنا هتكلم على حسب معلوماتي
في الأول موضوع الجينيريك اتعمل علشان يحي مشكلة زي ديه
class A{
}
class B{
}
class Main{
public static void main(String [] args){
ArrayList list = new ArrayList();
list.add(new A());
list.add(new B());
B b = (B)list.get(0);
}
}الكود اللي فوق داه ككموبيلر مش هيعترض، بس هتيجي المشكلة وقت الرن تيم هيرمي إكسبشن كلاس كاست إكسبشن.
ليه لأن الميثود اللي بتضيف الحاجة لللست بتاخد حاجة من نوع أوبجيكت والميثود اللي بترجع بترجع الحاجة من نوع أوبجيكت.
فلو حطيت فيها أي حاجة مش هتعترض (طبعا أنا قصدي أي انستانس مش بريميتيف) ، بس لما تيجي تجيب الحاجة من الليسته لازم تعمل الكاست بتاعها صح. لأن الكومبيلر مش هينبهك.
يعني مينفعشي تحط فيها أوبجيكت من نوع A ولما تيجي تخرجه تطلعه وتكاسته على B
فبتوع الجافا قالوا ان أغلب استخدامات الليستة بتكون علشان تحط فيها نوع واحد بس، يعني مثلا انتا بتعمل غالبا ليستة من الموظفين أو من المنتجات. عمرك ما احتجت تعمل ليستة علشان تحط فيها الموظفين والمنتجات مع بعض.
فقالوا ليه منخليش المبرمج وهو بيعمل الليستة يقولنا هو عايز يحط فيها الحاجة من نوع إيه ونخلي الكومبيلر ياخد يمنع الأخطاء اللي زي الموجودة فوق.
فخلونا نقول نفس المثال اللي فوق بس بعد استخدام الجينيريك.
class A{
}
class B{
}
class Main{
public static void main(String [] args){
ArrayList <A>list = new ArrayList<A>();
list.add(new A());
list.add(new B());
B b = (B)list.get(0);
}
}كل اللي زاد هو ان احنا واحنا بنعمل الليستة قولناله خلي بالك احنا مش عايزين نحط فيها إلا حاجة من نوع A. علشان كده الكومبيلر هيعترض على طول على السطرين دول
list.add(new B()); B b = (B)list.get(0);
الأول لأنك حاولت تحط في الليستة حاجة من نوع B مع انك قولتله انك مش هتحط غير حاجة ةمن نوع A
السطر التاني برضه لانك قولتله انك مش هتحط غير حاجة من نوع A ومع ذلك وانتا بتخرج الحاجة من الليستة بتقوله طلعلي منها B. ازاي وانتا مينفعشي تحط فيها غير A
جات مشكلة ظهرت جديدة خد مثلا السطرين دول
ArrayList <String> list = new ArrayList<String>(); ArrayList <Object> obj = list;
للأسف السطرين دول هيعملوا مشكلة مع ان الاسترينج عبارة في الآخر عن أوبجيكت، بس ميعفعشي تحط ليستة من الاسترينج في ليستة من الأوبجيكت ليه؟
تخيل السيناريو داه
انك جيت بعد كده وكتبت السطر داه تحتي اللي فوق على طول
obj.add(new A());
انتا كده اللي انتا ضفته في الليستة بتاعة الأوبجيكت اتحط في الليستة بتاعة الاسترينج لأنهم في الواقع بيشاورا على نفس الحاجة. والكومبيلر بالنسباله انتا سليم لأنك بتحط حاجة من نوع A اللي هي برضه من نوع Object جوه الليستة اللي اسمها Obj اللي انتا قايلوا انك هتحط فيها حاجات من نوع أوبجيكت.
تخيل انك جيت بعد كده حطيت السطر داه كمان
String s = list.get(0);
دلوقتي الليستة بتاعة الاسترينج اتحط فيها حاجة من نوع A . لأنه اتحط عن طريق الreference بتاع obj اللي هو برضه بيشاور على الليستة بتاعة الاسترينج
دلوقتي لو انتا جيت على ال reference اللي اسمه list واللي انتا وانتا بتعمله قولت انك هتحط فيه String فبالتالي السطر اللي فوق الكومبيلر مش هيعترض عليه، بس وقت الرن تايم هيجيب اللي في الليستة هيلاقيه من نوع A يجي يحطه في استرينج هيقوم رامي اكسبشن
طبعا المشكلة اللي فوق مش بتحصل لأن صن أصلا منعت التالي :
مينفعشي تعمل ليستة بالجينيريك وتحدد النوع بتاعها على انه Object تحط فيها أي حاجة تحت الأوبجيكت زي الاسترينج أوتخليها تشاور على ليستة محدد نوعها انه استرينج
مينفعشي تعمل ليستة بالجينيريك وتحدد النوع بتاعها على انه Person تحط فيها أي حاجة تحت Person زي Student، أوتخليها تشاور على ليستة محدد نوعها انه Student
مينفعشي تعمل ليستة بالجينيريك وتحدد النوع بتاعها على انه Animal تحط فيها أي حاجة تحت Animal زي Cat، أوتخليها تشاور على ليستة محدد نوعها انه Cat
طبعا داه كده قصور في الجينيريك بس صن لفت حول هذه المشكلة ازاي
أقولكم بعد صلاة الفجر ان شاء الله
تم تعديل هذه المشاركة بواسطة prog_omer في 9 نوفمبر 2007 في 05:10
هذا الموضوع مغلق.
المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية
جارٍ التحقق من المتواجدين…