0Pricing
Java Academy · درس

تحويلات التوسيع والتضييق

تعلّم تحويلات التوسيع التلقائية وكيفية إجراء تحويلات التضييق الصريحة بأمان

تحويلات التوسيع والتضييق درس مجاني في Java Academy على CoddyKit. هذا هو الدرس 2 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Java Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Java Academy 4 دروس في المجموع.

تحويلات الأنواع في Java

يتيح Java تحويل القيم بين الأنواع المتوافقة. وهناك اتجاهان:

  • التوسيع — التحويل إلى نوع أكبر (آمن وتلقائي)
  • التضييق — التحويل إلى نوع أصغر (محفوف بالمخاطر ويتطلب تحويلًا صريحاً)

التحويل بالتوسيع

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

ترتيب التوسيع: byte → short → int → long → float → double

byte b = 42;
short s = b;    // byte → short (widening)
int i = s;      // short → int (widening)
long l = i;     // int → long (widening)
float f = l;    // long → float (widening)
double d = f;   // float → double (widening)

System.out.println(d); // 42.0

التحويل بالتضييق

يجب إجراء التضييق صراحةً باستخدام عامل التحويل (type). وقد تُقتطع القيمة أو تتشوّه إذا لم تتسع لها سعة النوع الهدف.

double price = 99.99;
int wholePart = (int) price; // narrows — decimal truncated
System.out.println(wholePart); // 99 (not rounded!)

long bigNum = 130L;
byte small = (byte) bigNum;  // 130 overflows byte (max 127)
System.out.println(small);   // -126 (unexpected!)

تجاوز السعة أثناء التضييق

عندما تتجاوز قيمةٌ السعة أثناء التضييق، يلفّها Java باستخدام الحساب بترديد معياري، ولا يُلقى أي استثناء. ويجب عليكم منع ذلك يدوياً.

int million = 1_000_000;
byte narrowed = (byte) million;
System.out.println(narrowed); // 64 (wraps around)

// Safe narrowing: check bounds first
if (million >= Byte.MIN_VALUE && million <= Byte.MAX_VALUE) {
    byte safe = (byte) million;
} else {
    System.out.println("Value doesn't fit in byte!");
}

تحويلات char وint

إن char عدد صحيح غير موقّع من 16 بت يمثّل نقطة شفرة Unicode. ويتوسع تلقائياً إلى int، لكن يجب تحويله صراحةً من int إلى char.

char letter = 'A';
int code = letter;          // widening: char → int
System.out.println(code);   // 65

int nextCode = code + 1;
char nextLetter = (char) nextCode; // narrowing: int → char
System.out.println(nextLetter);    // B

// Useful for Caesar cipher shifts
char shifted = (char) ('a' + 3);
System.out.println(shifted); // d

اقتطاع التحويل من الفاصلة العائمة إلى عدد صحيح

يؤدي تحويل عدد ذي فاصلة عائمة إلى عدد صحيح إلى الاقتطاع باتجاه الصفر، وليس التقريب. استخدموا Math.round() إذا كنتم بحاجة إلى التقريب.

double pos = 3.9;
double neg = -3.9;

System.out.println((int) pos);         // 3 (not 4)
System.out.println((int) neg);         // -3 (not -4)
System.out.println(Math.round(pos));   // 4
System.out.println(Math.round(neg));   // -4

تحويل String إلى أعداد

يتطلب تحليل String إلى عدد استخدام أساليب الأصناف المُغلِّفة، وليس التحويل النوعي. ويؤدي تمرير سلسلة غير رقمية إلى طرح NumberFormatException.

String input = "42";
int parsed = Integer.parseInt(input);
double parsedD = Double.parseDouble("3.14");

System.out.println(parsed + 1);  // 43
System.out.println(parsedD);     // 3.14

try {
    int bad = Integer.parseInt("abc");
} catch (NumberFormatException e) {
    System.out.println("Not a valid number!");
}

تحويل الأعداد إلى String

يمكن تحويل عدد إلى String باستخدام String.valueOf() أو Integer.toString() أو بضم السلسلة النصية مع "".

int score = 95;
String s1 = String.valueOf(score);    // "95"
String s2 = Integer.toString(score);  // "95"
String s3 = score + "";              // "95" (concat trick)

System.out.println(s1.getClass().getSimpleName()); // String

// Converting to different bases
System.out.println(Integer.toBinaryString(42)); // 101010
System.out.println(Integer.toHexString(255));   // ff

الترقية في التعبيرات

في التعبيرات الحسابية، تُجري Java ترقية للمعاملات تلقائيًا:

  • تُرقّى byte وshort وchar إلى int قبل إجراء العملية
  • إذا كان أحد المعاملين long، تكون النتيجة من النوع long
  • إذا كان أحدهما float أو double، تطابق النتيجة النوع الأوسع
byte x = 10;
byte y = 20;
// byte z = x + y; // compile error! sum is promoted to int
int z = x + y;      // correct

long a = 100L;
float b = 2.5f;
double result = a * b; // long * float → double
System.out.println(result); // 250.0

عوامل الإسناد المركبة

تتضمن العوامل المركبة مثل += و-= و*= تحويلًا تضييقيًا ضمنيًا. ويتيح لك ذلك كتابة شيفرة موجزة باستخدام متغيرات byte وshort.

byte count = 100;
// count = count + 1; // compile error — int result needs cast
count += 1;           // OK — compound op casts automatically
System.out.println(count); // 101

short total = 1000;
total *= 2;  // implicit narrow cast included
System.out.println(total); // 2000

تطبيقي: تحليل الأعداد الصحيحة بأمان

نمط عملي شائع: حلّل إدخال المستخدم بأمان، وتحقق من المجال، ثم ضيّقه إلى النوع المطلوب بدقة.

public static byte parseAsByte(String input) {
    int value = Integer.parseInt(input); // can throw NumberFormatException
    if (value < Byte.MIN_VALUE || value > Byte.MAX_VALUE) {
        throw new IllegalArgumentException(
            "Value " + value + " out of byte range");
    }
    return (byte) value;
}

// Usage
System.out.println(parseAsByte("100")); // 100
System.out.println(parseAsByte("200")); // IllegalArgumentException

تحقق سريع

ما ناتج الشيفرة التالية؟

double d = -7.8;
int i = (int) d;
System.out.println(i);

مراجعة: التوسيع والتضييق

أهم النقاط:

  • التحويل التوسيعي تلقائي وآمن: byte→short→int→long→float→double
  • يتطلب التحويل التضييقي تحويلًا نوعيًا صريحًا، وقد يؤدي إلى فقدان البيانات أو حدوث تجاوز
  • يتوسع char إلى int، ويمكن تضييق int مجددًا إلى char باستخدام تحويل نوعي
  • يؤدي التحويل من الأعداد العشرية إلى int إلى القطع باتجاه الصفر، وليس التقريب
  • استخدم Integer.parseInt/Double.parseDouble لتحويل Strings إلى أعداد
  • تتضمن العوامل المركبة (+=، *=) تحويلات تضييقية ضمنية

الأسئلة الشائعة

هل درس «تحويلات التوسيع والتضييق» مجاني؟

نعم — نص درس «تحويلات التوسيع والتضييق» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Java Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Java Academy 4 دروس في المجموع.

ماذا ستتعلم في «تحويلات التوسيع والتضييق»؟

تعلّم تحويلات التوسيع التلقائية وكيفية إجراء تحويلات التضييق الصريحة بأمان تتمرن على Java Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ Java Academy؟

لا تُشترط خبرة سابقة. Java Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 2 من أصل 4.

كم من الوقت يستغرق درس «تحويلات التوسيع والتضييق»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس Java Academy هذا؟

نعم. كل درس في Java Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. الأنواع البدائية مقابل الأنواع المرجعية
  2. تحويلات التوسيع والتضييق
  3. العامل instanceof
  4. تحويل الأنواع عمليًا
← العودة إلى Java Academy