Selon http://download.oracle.com/javase/1.4.2/docs/api/java/lang/Class.html#getDeclaredMethods%28%29 Class.getDeclaredMethods() ne devrait inclure que les méthodes "déclarées par la classe". Cependant, j'obtiens des résultats assez surprenants avec le code de test ci-dessous :
import java.util.Arrays;
class A {
public static A m1() { return null; }
public static A m2() { return null; }
public static A m3() { return null; }
}
class B extends A {
public static A m1() { return null; }
public static B m2() { return null; }
// public static Object m3() { return null; } won't compile
}
public class Scratch {
public static void main(final String[] args) {
System.out.println(Arrays.asList(B.class.getDeclaredMethods()));
}
}
Quelques éléments qui me semblent assez étranges/surprenants :
-
Le compilateur se plaint que B.m3() a un type de retour incompatible avec A.m3(). Ceci est dicté par la JSL 8.4.8.3 (Page 225 v3 langspec-3.0.pdf). Mais je suis curieux de savoir pourquoi cette restriction doit s'appliquer aux méthodes statiques. Si je comprends bien, les méthodes statiques peuvent être cachées et non surchargées, et la référence est résolue au moment de la compilation, alors quel est le raisonnement derrière cette restriction ?
-
Deux méthodes m2() sont incluses dans la sortie. Cela semble contredire l'affirmation selon laquelle getDeclaredMethods() ne renvoie que les méthodes "déclarées par la classe", et "exclut les méthodes héritées". Je ne vois pas A.m2() comme "déclarée par" B.
-
Un m1() est inclus dans la sortie. Suivant le point précédent, s'il était logique de laisser getDeclaredMethods() retourner deux m2(), pourquoi ne retourne-t-il pas aussi deux m1() ? Après tout, ce sont deux méthodes distinctes, et l'une est cachée par l'autre. Je ne vois pas de différence fondamentale entre les cas de m1() et m2(), à l'exception du type de retour qui est le même dans le cas de m1(), mais le type de retour, comme je le comprends, ne fait pas partie de la signature de la méthode ?
Merci d'avance !