مثيل - أنواع المعاملات الشرطية غير المتوافقة
-
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
. إنه يمنعك من التفكير في أنك حصلت على اختبار ذي معنى عندما يكون في الواقع يطبع "خطأ" دائمًا.