تحويل الأنواع والتحوّل بينها
تحويل الأنواع والتحوّل بينها
في الدروس السابقة صرّحت عن متغيّرات بأنواع محدّدة: int وdouble وlong وغيرها. البرامج الحقيقية تنقل البيانات باستمرار بين هذه الأنواع — تخزين درجة حرارة مقاسة (قيمة double) في حقل صحيح، أو قراءة مدخلات المستخدم (دائمًا String) ومعاملتها كرقم، أو الاحتفاظ بمجموع تراكمي في long رغم أن القيم الفردية من نوع int. يغطّي هذا الدرس كل آليات Java للتعامل مع ذلك بأمان.
اتجاهان: التوسيع والتضييق
تخيّل الأنواع العددية الأساسية مرتّبةً من الأصغر إلى الأكبر:
التوسيع (Widening) يتجه للأعلى في السلسلة — نوع أصغر يتّسع تمامًا في حاوية أكبر دون فقد بيانات، لذا تُجريه Java تلقائيًا (ضمنيًا). التضييق (Narrowing) يتجه للأسفل — إجبار قيمة كبيرة في حاوية أصغر قد يُفقد بيانات، لذا تطلب Java كتابة تحويل صريح.
التحويل الضمني (التوسيع)
لا تحتاج إلى صياغة تحويل. تقوم Java بالعمل نيابةً عنك:
التحويل الصريح (التضييق)
حين تريد السير في الاتجاه المعاكس تكتب النوع الهدف بين قوسين أمام القيمة:
الصياغة هي (targetType) expression. التحويل لا يقرّب؛ بل يقطع — يُسقط الجزء الكسري ببساطة.
(int) 36.99 يُعطي 36 لا 37. إذا احتجت تقريبًا صحيحًا استخدم Math.round() أولًا، التي تُعيد long يمكنك تحويله بعدها إلى int.
الفيضان العددي (Integer Overflow)
أخطر جانب في التضييق هو الفيضان (Overflow): حين تكون القيمة أكبر من سعة النوع الهدف، تُقطع الأجزاء الزائدة وينتج رقم خاطئ — لكن بصمت تام:
لا تُلقي Java استثناءً هنا. تلتفّ القيمة بصمت. القاعدة بسيطة: تحقّق دائمًا أن القيمة تتّسع في النوع الهدف قبل التحويل.
Integer.MAX_VALUE وInteger.MIN_VALUE لمعرفة النطاق الآمن: 2_147_483_647 و-2_147_483_648. كل صنف مُغلِّف للأنواع الأساسية (Long وShort وByte) يحوي ثوابت مكافئة.
char والأنواع العددية
يخزّن char نقطة كود Unicode — عدد صحيح غير منخفض 16 بت. يشارك في التوسيع والتضييق تمامًا كالأنواع العددية:
تحليل النصوص إلى أرقام
يُعطيك Scanner نصًا خامًا من نوع String من سطر الأوامر (أو ملف). لإجراء العمليات الحسابية يجب تحليل ذلك النص إلى نوع عددي. كل صنف مُغلِّف يوفّر تابعًا ساكنًا parse*:
NumberFormatException. إذا لم يكن النص رقمًا صالحًا — مثل "12abc" أو نص فارغ — يتعطّل parseInt في وقت التشغيل. ستتعلّم التعامل مع ذلك بـ try-catch في درس الاستثناءات.
تحويل الأرقام إلى نصوص
السير في الاتجاه المعاكس — تحويل رقم إلى String — آمن دائمًا ولا يستلزم تحويلًا صريحًا. ثلاثة أساليب شائعة:
الخلاصة
تحويلات التوسيع تلقائية وآمنة. تحويلات التضييق تستلزم تحويلًا صريحًا وتقطع الكسور وقد تُفضي إلى فيضان صامت — تحقّق دائمًا أن القيمة تتّسع في النوع الهدف. استخدم Integer.parseInt وDouble.parseDouble وأخواتها لتحويل مدخلات String إلى أرقام، واحرص على الحماية من المدخلات غير الصالحة. هذه الأنماط تظهر في كل برنامج Java تكاد تكتبه.