مثيل - أنواع المعاملات الشرطية غير المتوافقة

StackOverflow https://stackoverflow.com/questions/2551337

  •  23-09-2019
  •  | 
  •  

سؤال

ما يلي يجمع بشكل جيد:

  Object o = new Object();
  System.out.println(o instanceof Cloneable);

لكن هذا لا:

  String s = new String();
  System.out.println(s instanceof Cloneable);

يتم إلقاء خطأ المترجم.

ما المشكلة؟

هل كانت مفيدة؟

المحلول

تجسيد أكثر وضوحًا لمشكلتك هو ما يلي:

if ("foo" instanceof Number)
   // "Incompatible conditional operand types String and Number"

تم تحديد هذا في JLS 15.20.2 مشغل مقارنة النوع instanceof:

RelationalExpression:
       RelationalExpression instanceof ReferenceType

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

هذا هو ، نظرًا لأن هذا التعبير المصبوب يولد خطأ في وقت الترجمة:

(Number) "foo"

لذلك يجب أن هذا التعبير:

("foo" instanceof Number)

حالتك أكثر دقة بعض الشيء ، لكن المبدأ هو نفسه:

  • String هو الفصل النهائي
  • String لا ينفذ Cloneable
  • لذلك لا يمكنك القيام به (Cloneable) aString
  • لذلك أيضًا لا يمكنك القيام به aString instanceof Cloneable

نصائح أخرى

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

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

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top