سؤال

الوظائف المثقلة compute1(), compute2(), ، و compute5() تسبب أخطاء في الترجمة إذا حاولت استخدامها أدناه:

package com.example.test.reflect;

class JLS15Test2
{
    int compute1(Object o1, Integer i, Integer j)         { return 1; }
    int compute1(String s1, Integer i, int j)             { return 2; }

    int compute2(Object o1, Integer i, int j)             { return 3; }
    int compute2(String s1, Integer i, Integer j)         { return 4; }

    int compute3(Object o1, Integer i, int j)             { return 5; }
    int compute3(String s1, Integer i, int j)             { return 6; }

    int compute4(Object o1, Integer i, Integer j)         { return 7; }
    int compute4(String s1, Integer i, Integer j)         { return 8; }

    int compute5(Object o1, Integer i, Object j)          { return 9; }
    int compute5(String s1, Integer i, int j)             { return 10; }


    public static void main(String[] args) 
    {
        JLS15Test2 y = new JLS15Test2();

        // won't compile:
        // The method compute1(Object, Integer, Integer) is ambiguous 
        // for the type JLS15Test2
        // System.out.println(y.compute1("hi", 1, 1));

        // Neither will this (same reason)
        // System.out.println(y.compute2("hi", 1, 1));
        System.out.println(y.compute3("hi", 1, 1));
        System.out.println(y.compute4("hi", 1, 1));

        // neither will this (same reason)
        // System.out.println(y.compute5("hi", 1, 1));
    }
}

بعد قراءة القسم 15.12 من JLS، أعتقد أنني أفهم...في المرحلة 2 (مسموح بالملاكمة/الفتح، بدون varargs) لمطابقة الطرق المحملة بشكل زائد، عند تحديد "الطريقة الأكثر تحديدًا"، تقول JLS (في الواقع) أن الطريقة الأكثر تحديدًا هي الطريقة التي تعد معلماتها الرسمية أنواعًا فرعية من الطرق الأخرى القابلة للتطبيق والأوليات والكائنات (على سبيل المثال. int و Integer) لا تعد أبدًا أنواعًا فرعية من بعضها البعض.لذا Integer هو نوع فرعي من Integer, ، و int هو نوع فرعي من int, ، لكن Integer و int مقارنات الأنواع الفرعية w/r/t غير متوافقة، لذلك لا يوجد أي منهما compute1()/compute2() الأزواج لديهم طريقة أكثر تحديدًا.

(بينما في compute3() و compute4() الطريقة مع String الوسيطة أكثر تحديدًا من الطريقة مع Object الوسيطة، لذلك يقوم البرنامج بطباعة 6 و 8.)

هل تفكيري صحيح؟

هل كانت مفيدة؟

المحلول

نعم استدلالك صحيح

نصائح أخرى

إذا أضفت طريقة أخرى تأخذ فقط int البدائي وعددًا صحيحًا محاصرًا، فيمكنها تحديد الطريقة المناسبة التي يمكن استدعاؤها:

int compute6(int i) { return 11;}
int compute6(Integer i){return 12;}
...
System.out.println(y.compute6(1));

بناءً على ذلك، أتصور أن الأمر يتعلق بالتفاعل بين المعلمات المختلفة، وليس فقط العلاقات المنفصلة.

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