سؤال

لقد حاولت تمرير قائمة التهيئة {...} إلى مُنشئ ولم ينجح الأمر.عندما أعلنت ذلك بدلاً من ذلك في متغير محلي للطريقة (int[]) كان يعمل بشكل لا تشوبه شائبة.

لماذا هذا؟

public class QuickSort {
    int[] a;

    public QuickSort(int[] a) {
        this.a = a;
    }

    public static void main(String[] args) {
        // ###################
        // ###    WORKS     ##
        // ###################
        int[] a = {8,12,79,12,50,44,8,0,7,289,1};
        QuickSort sort = new QuickSort(a);

        // ###################
        // ### DOESN'T WORK ##
        // ###################
        //QuickSort sort = new QuickSort({8,12,79,12,50,44,8,0,7,289,1});
    }
}
هل كانت مفيدة؟

المحلول

عند اعلان حالة int[] وتعيين {1, 2, 3} المترجم يعلم أنك تريد إنشاء int[] كما انها المنصوص عليها هناك.

في هذه الحالة الأخيرة حيث كنت عصا مجموعة مباشرة في طريقة الاتصال قد تضطر إلى استخدام

QuickSort sort = new QuickSort(new int[] {8,12,79,12,50,44,8,0,7,289,1});

ولنقول للمترجم ما هي مجموعة الخاصة بك.

نصائح أخرى

ال {} يسمى البناء مُهيئ المصفوفة، ويتم استخدامه لتهيئة مصفوفة في Java.(مرجع: القسم 10.6:مُهيئات المصفوفة من مواصفات لغة جافا، الطبعة الثالثة.)

سبب المرور {1, 2, 3} في حد ذاته غير صالح لأنه لا توجد معلومات نوع مرتبطة بالمُهيئ.

ولذلك، يجب على المرء أن يسمح للمترجم بمعرفة نوع المصفوفة عن طريق الكتابة new Type[], ، أين ال Type هو النوع الذي تم إنشاء المصفوفة من أجله.

ما يلي كلها استخدام صالح لمهيئ الصفيف:

  • new String[] {"Hello, "World"}
  • new Character[] {'A', 'B'}
  • new Runnable[] {new Runnable() {public void run() {}}, new Runnable() {public void run() {}}

كما ترى، يمكن استخدام هذا الترميز للعديد من أنواع البيانات، لذا فهو ليس شيئًا خاصًا بالأعداد الصحيحة.

أما بالنسبة لل:

int[] a = {1, 2, 3};

سبب صحة ما سبق هو أنه يتم توفير معلومات النوع للمترجم في إعلان نوع المتغير، وهو في هذه الحالة int[].وما يدل عليه ما سبق هو ما يلي:

int[] a = new int[] {1, 2, 3};

الآن، إذا كان لدينا new int[] {1, 2, 3}, ، نحن قادرون على إنشاء جديد int[] مجموعة في مكانها، بحيث يمكن التعامل معها كأي دولة أخرى int[] array - إنه فقط لا يحتوي على اسم متغير مرتبط به.

ولذلك، فإن المصفوفة التي تم إنشاؤها بواسطة new int[] {1, 2, 3} يمكن إرسالها إلى طريقة أو مُنشئ يأخذ int[] كحجتها:

new Quicksort(new int[] {1, 2, 3});  // This will work.

وهذا هو الأرجح لأن قائمة التهيئة لديه أي معلومات الكتابة إليها. جرب هذا:

QuickSort sort = new QuickSort(new int[] {8,12,79,12,50,44,8,0,7,289,1});

ويمكنك أيضا قيام مثل هذا:

public class QuickSort {
    int[] a;

    public QuickSort(int ... a) {
        this.a = a;
    }

    public static void main(String[] args) {

        QuickSort sort = new QuickSort(8,12,79,12,50,44,8,0,7,289,1);
    }
}

وجافا لا يملك في الواقع نوع الاستدلال. تعريفات المتغير مجموعة هي حالة خاصة في مواصفات لغة جافا، واحدة أن لا ينطبق على معلمات الأسلوب. ذلك من شأنه أن يكون ممكنا، ولكن من شأنه أن يضيف الكثير من التعقيد إلى المواصفات، لأنه لن يكون للتعامل مع أسئلة مثل ما إذا كان { "أ"، "ب"} يخلق سلسلة [] أو كائن [] - يبدو واضحا هنا، ولكن ماذا لو كان الكائنات في نوع التسلسل الهرمي المعقد؟ وماذا لو طاقتها الطريقة وجود كلا الإصدارين؟

لا يجوز

والأقواس مجعد (عند استخدامها في الحرفية مجموعة) يمكن أن تستخدم عندما تعلن مجموعة:)

هل حاولت صب قائمة إلى int [] قبل تمريرها إلى منشئ؟

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