getDeclaredMethods () и статический метод скрытого суперкласса

Согласно 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. м3 (). Это продиктовано JSL 8.4.8.3 (стр. 225 v3 langspec-3.0.pdf). Но мне любопытно, почему это ограничение нужно применять к статическим методам. Насколько я понимаю, статические методы можно скрыть, но не переопределить, и что ссылка разрешается во время компиляции, так какова причина этого ограничения?

  • В вывод включены два метода m2 (). Это, похоже, противоречит утверждению, что getDeclaredMethods () возвращает только методы, «объявленные классом», и «исключает унаследованные методы». Я не вижу A.m2 () как «объявленный» B.

  • Один m1 () включен в вывод. Следуя предыдущему пункту, если имеет смысл позволить getDeclaredMethods () возвращать два m2 (), почему он также не возвращает два m1 ()? В конце концов, это два разных метода, и один скрыт за другим. Я не Не видите ли принципиальной разницы между случаями m1 () и m2 (), за исключением того, что тип возвращаемого значения такой же в случае m1 (), но тип возврата, как я понимаю, не является частью сигнатуры метода?

Спасибо заранее!

7
задан RAY 4 November 2010 в 02:23
поделиться