getDeclaredMethods () и скрытый статический метод суперкласса - PullRequest
7 голосов
/ 04 ноября 2010

Согласно 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 (), но, как я понимаю, тип возвращаемого значения не является частью сигнатуры метода?

Заранее спасибо!

Ответы [ 2 ]

3 голосов
/ 10 октября 2012

Я могу подтвердить, что ошибка http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6815786 все еще присутствует в Oracle Java Windows 64-bit 1.6.0_35.

2 голосов
/ 05 ноября 2010

См. http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6815786

Хотя об этом сообщалось в отношении 1.6.0_12-b04 2009-03-11 05: 44: 57.0, но Sun приняла его 2010-07-22 01: 25: 56.0

вкратце:

Сводка (отражает) Class.getDeclaredMethods () возвращает унаследованные методы

Категория java: classes_lang

Сообщено Против

Состояние 3-Принято, ошибка

Приоритет: 3-Средний

Дата отправки 11-MAR-2009

Работа вокруг N / A

Оценка Будет расследовать.

Дата публикации: 2010-07-22 01: 25: 56.0

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...