Согласно http://download.oracle.com/javase/1.4.2/docs/api/java/lang/Class.html#getDeclaredMethods%28%29, Class.getDeclaredMethods () должен включать только методы, "объявленные классом".Тем не менее, я получаю довольно неожиданные результаты с тестовым кодом ниже:
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()));
}
}
Несколько вещей, которые выглядят довольно странно / удивительно для меня:
Компиляторпожаловаться на то, что B.m3 () имеет несовместимый тип возврата с A.m3 ().Это продиктовано JSL 8.4.8.3 (стр. 223 v3 langspec-3.0.pdf).Но мне любопытно, почему это ограничение необходимо применять к статическим методам.Насколько я понимаю, что статические методы могут быть скрыты и не могут быть переопределены, и что ссылка разрешается во время компиляции, так какова причина этого ограничения?
Два метода m2 ()включены в вывод.Похоже, это противоречит утверждению о том, что getDeclaredMethods () возвращает только методы, «объявленные классом», и «исключая унаследованные методы».Я не вижу A.m2 () как "объявленный" B.
Один m1 () включен в вывод.Следуя предыдущему пункту, если имеет смысл позволить getDeclaredMethods () возвращать два m2 (), почему он также не возвращает два m1 ()?В конце концов, это два разных метода, и один скрыт другим.Я не вижу никакой принципиальной разницы между случаем m1 () и m2 (), за исключением того, что тип возвращаемого значения одинаков в случае m1 (), но, как я понимаю, тип возвращаемого значения не является частью сигнатуры метода?
Заранее спасибо!