كيفية تمرير مصفوفة Kotlin إلى varargs في Java: دليل شامل للمبتدئين

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

مصفوفة Kotlin في varargs Java: كيف لا تفسد التوافق وتكتب كودًا نظيفًا

\n\n

هل سبق لك أن كتبت كودًا بلغة Kotlin، واستدعيت طريقة Java قديمة جيدة تحتوي على varargs — وفجأة حصلت على خطأ في الترجمة؟ إذا كان الأمر كذلك، فأنت لست وحدك. سؤال "Convert Kotlin Array to Java varargs" حصل على آلاف المشاهدات على Stack Overflow. وهذا ليس مفاجئًا: على الحد الفاصل بين اللغتين، غالبًا ما تظهر تفاصيل دقيقة غير واضحة.

\n\n

في هذه المقالة، سنشرح كيفية تمرير مصفوفة Kotlin بشكل صحيح إلى طريقة Java بعدد متغير من الوسائط. ستتعرف على ما هو spread-operator، ولماذا Array<String> لا يساوي String... وكيفية تجنب الأخطاء الشائعة. هيا بنا!

\n\n

ما هو varargs في Java ولماذا هو مطلوب

\n\n

بداية، دعنا نتذكر الأساسيات. Varargs (وسائط متغيرة الطول) هي آلية في Java تسمح بتمرير عدد عشوائي من الوسائط من نفس النوع إلى طريقة. من الناحية التركيبية، يُشار إليها بثلاث نقاط بعد النوع:

\n\n
public void printMessages(String... messages) {\n    for (String msg : messages) {\n        System.out.println(msg);\n    }\n}
\n\n

يمكنك استدعاء هذه الطريقة على النحو التالي:

\n\n
printMessages("Hello");\nprintMessages("Hello", "World");\nprintMessages(); // الاستدعاء الفارغ يعمل أيضًا
\n\n

داخل الطريقة، يتم تمثيل الوسائط كمصفوفة String[]. ولكن من الخارج — هي مجرد مجموعة من القيم مفصولة بفواصل. مريح، أليس كذلك؟

\n\n

والآن تخيل أن لديك مصفوفة Kotlin، وتريد تمريرها إلى طريقة Java كهذه. الكود الساذج لن يعمل:

\n\n
val messages = arrayOf("Hello", "World")\nprintMessages(messages) // خطأ في الترجمة!
\n\n

لماذا؟ لأن Kotlin أكثر صرامة فيما يتعلق بالأنواع. طريقة Java تتوقع String...، بينما أنت تمرر Array<String>. هذان شيئان مختلفان. يرى المترجم عدم التطابق ويصدر خطأ.

\n\n

الحل: spread-operator (عامل التشغيل *)

\n\n

في Kotlin، توجد لهذه الحالات spread-operator — وهي علامة النجمة * قبل المصفوفة. إنها حرفيًا «تفرد» المصفوفة إلى عناصر فردية، والتي يتم تمريرها بعد ذلك كـ varargs.

\n\n
val messages = arrayOf("Hello", "World")\nprintMessages(*messages) // يعمل!
\n\n

كل شيء عبقري بسيط. لكن دعنا نفهم كيف يعمل هذا تحت الغطاء.

\n\n

كيف يقوم spread-operator بتحويل الأنواع

\n\n

عندما تكتب *messages، يقوم Kotlin بما يلي:

\n
    \n
  • يأخذ كل عنصر من المصفوفة
  • \n
  • «يستخرجها» من الغلاف Array
  • \n
  • يمررها كوسائط منفصلة إلى طريقة Java
  • \n
\n\n

بالنسبة لطريقة Java، يبدو هذا كما لو كنت قد كتبت printMessages("Hello", "World"). لا مصفوفات — فقط سلاسل نصية نقية.

\n\n

ملاحظة مهمة: spread-operator يعمل فقط مع Array (وبعض المجموعات الأخرى عبر toTypedArray()). لا يمكن فرد List العادي بهذه الطريقة.

\n\n

الأخطاء الشائعة وكيفية تجنبها

\n\n

حتى مع معرفة spread-operator، غالبًا ما يرتكب المبتدئون أخطاء. إليك أكثرها شيوعًا.

\n\n

الخطأ 1: تمرير المصفوفة بدون علامة النجمة

\n\n
// غير صحيح:\nval numbers = intArrayOf(1, 2, 3)\nsomeJavaMethod(numbers) // خطأ\n\n// صحيح:\nsomeJavaMethod(*numbers.toTypedArray())
\n\n

لاحظ: بالنسبة للأنواع البدائية (IntArray، DoubleArray، إلخ) يجب أولاً تحويلها إلى Array عبر .toTypedArray(). spread-operator يعمل فقط مع المصفوفات الكائنية.

\n\n

الخطأ 2: الخلط مع List

\n\n

يحاول الكثيرون تمرير List<String> مباشرة:

\n\n
val list = listOf("A", "B")\nprintMessages(*list) // خطأ! List != Array
\n\n

الحل: قم أولاً بتحويل القائمة إلى مصفوفة:

\n\n
printMessages(*list.toTypedArray())

المدونات

توصيات الكتب