Question

Les fonctions surchargées compute1(), compute2(), et compute5() provoquer des erreurs de compilation si vous essayez de les utiliser ci-dessous :

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));
    }
}

Après avoir lu la section JLS 15.12, je pense avoir compris...dans la phase 2 (boxing/unboxing autorisé, pas de varargs) de mise en correspondance des méthodes surchargées, lors de la détermination de la "méthode la plus spécifique", le JLS dit (en effet) que la méthode la plus spécifique est celle dont les paramètres formels sont des sous-types d'autres méthodes applicables , et les primitives et les objets (par ex. int et Integer) ne sont jamais des sous-types les uns des autres.Donc Integer est un sous-type de Integer, et int est un sous-type de int, mais Integer et int sont incompatibles avec les comparaisons de sous-types, donc aucun des deux compute1()/compute2() les paires ont une méthode très spécifique.

(Alors que dans compute3() et compute4() la méthode avec le String L'argument est plus spécifique que la méthode avec le Object argument, donc le programme imprime 6 et 8.)

Mon raisonnement est-il correct ?

Était-ce utile?

La solution

Oui, votre raisonnement est correct.

Autres conseils

Si vous ajoutez une autre méthode qui prend simplement un entier primitif et un entier encadré, elle est capable de déterminer laquelle est la méthode appropriée à appeler :

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

Sur cette base, j'imagine que cela a quelque chose à voir avec l'interaction entre les différents paramètres, et pas seulement avec les relations de types distinctes.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top