التحويل إلى الأعلى والأسفل وinstanceof
افهم التحويل إلى نوع أب، والتحويل الآمن إلى نوع فرعي باستخدام instanceof، والأخطاء الشائعة التي تسبب ClassCastException.
التحويل إلى الأعلى والأسفل وinstanceof درس مجاني في Java Academy على CoddyKit. هذا هو الدرس 3 من أصل 3. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Java Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Java Academy 3 دروس في المجموع.
التحويل التصاعدي والتنازلي
التحويل التصاعدي يضع كائنًا من فئة فرعية في مرجع من نوع الفئة الأصلية، وهو آمن دائمًا. أما التحويل التنازلي فيسير في الاتجاه المعاكس ويتطلب الحذر. ونستخدم instanceof للتحقق من النوع الفعلي وقت التشغيل.
الشيفرة: عرض توضيحي للتحويل التصاعدي
التحويل التصاعدي ضمني وآمن: يمكن التعامل مع Dog على أنه Animal. ويمكنكم استدعاء الدوال المعلنة في Animal، بينما تُنفَّذ نسخة Dog وقت التشغيل.
public class Main {
static class Animal {
void speak() { System.out.println("Animal sound"); }
}
static class Dog extends Animal {
void speak() { System.out.println("Woof"); }
void fetch() { System.out.println("Fetch!"); }
}
public static void main(String[] args) {
// Upcasting: Dog stored in an Animal reference (safe, automatic)
Animal a = new Dog();
a.speak(); // calls Dog's speak() due to dynamic binding
// a.fetch(); // Not allowed: reference is Animal, which does not declare fetch
System.out.println("Upcasting hides Dog-only methods from the reference type.");
}
}
لماذا نستخدم التحويل التنازلي؟
تستخدمون التحويل التنازلي عندما تحتاجون إلى دالة خاصة بالفئة الفرعية، مثل fetch(). وينبغي أن يكون ذلك نادرًا ومدعومًا بالتحقق المناسب. وفضّلوا كتابة الشيفرة اعتمادًا على الفئة الأصلية أو الواجهة متى أمكن.
الشيفرة: التحويل التنازلي الآمن
استخدموا instanceof قبل إجراء التحويل. إذا فشل التحقق، فتجاوزوا التحويل واختاروا مسارًا آخر؛ فهذا يتجنب ClassCastException.
public class Main {
static class Animal { void speak() { System.out.println("Animal sound"); } }
static class Dog extends Animal { void speak() { System.out.println("Woof"); } void fetch() { System.out.println("Fetch!"); } }
static class Cat extends Animal { void speak() { System.out.println("Meow"); } }
public static void main(String[] args) {
Animal a1 = new Dog();
Animal a2 = new Cat();
// Safe downcast using instanceof
if (a1 instanceof Dog) {
Dog d = (Dog) a1;
d.fetch(); // OK
}
if (a2 instanceof Dog) {
Dog d2 = (Dog) a2; // will not run
d2.fetch();
} else {
System.out.println("a2 is not a Dog, skip casting.");
}
}
}
الأخطاء الشائعة
خطأ شائع: قد يؤدي إجراء التحويل من دون تحقق إلى طرح ClassCastException. ومن الأخطاء أيضًا الإفراط في استخدام التحويلات التنازلية بدلًا من التصميم اعتمادًا على الواجهات. أبقوا التحويلات قريبة من الموضع الذي تحتاجون إليها فيه، وفضّلوا تعدد الأشكال.
الشيفرة: التحويل الخاطئ مقابل الآمن
لا تجروا التحويلات بشكل أعمى. إذا لم تكونوا متأكدين من نوع الكائن وقت التشغيل، فاحموا التحويل باستخدام instanceof واختاروا بديلًا آمنًا إذا لم يتطابق النوع.
public class Main {
static class Animal { void speak() { System.out.println("Animal"); } }
static class Dog extends Animal { void fetch() { System.out.println("Fetch!"); } }
static class Cat extends Animal { }
public static void main(String[] args) {
Animal a = new Cat();
// Bad: direct cast (would throw at runtime)
// Dog dBad = (Dog) a; // ClassCastException if uncommented
// Good: check first
if (a instanceof Dog) {
Dog d = (Dog) a;
d.fetch();
} else {
System.out.println("Not a Dog; skipping cast.");
}
}
}
التحقق من التحويل التنازلي
تحقق سريع: كيف تجرون تحويلًا تنازليًا آمنًا لمرجع Animal إلى Dog؟
مراجعة
مراجعة: التحويل التصاعدي آمن وشائع. ويتطلب التحويل التنازلي استخدام instanceof لتجنب الأعطال؛ وفضّلوا التصميم اعتمادًا على الأنواع الأصلية أو الواجهات لتقليل التحويلات.
الأسئلة الشائعة
هل درس «التحويل إلى الأعلى والأسفل وinstanceof» مجاني؟
نعم — نص درس «التحويل إلى الأعلى والأسفل وinstanceof» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Java Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Java Academy 3 دروس في المجموع.
ماذا ستتعلم في «التحويل إلى الأعلى والأسفل وinstanceof»؟
افهم التحويل إلى نوع أب، والتحويل الآمن إلى نوع فرعي باستخدام instanceof، والأخطاء الشائعة التي تسبب ClassCastException. تتمرن على Java Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Java Academy؟
لا تُشترط خبرة سابقة. Java Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 3 من أصل 3.
كم من الوقت يستغرق درس «التحويل إلى الأعلى والأسفل وinstanceof»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Java Academy هذا؟
نعم. كل درس في Java Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- الفئات المجرّدة
- الواجهات (مقدمة ومقارنة)
- التحويل إلى الأعلى والأسفل وinstanceof