Java:résolution au moment de la compilation et « méthode la plus spécifique »
-
15-11-2019 - |
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 ?
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.