У меня была странная ошибка в коде приложения, которое является обработчиком аннотаций, и я мог обнаружить, что основная причина ошибки заключалась в том, что класс com.sun.tools.javac.tree.JCTree$JCClassDecl
дважды содержит метод getSimpleName()
, когда я запрашиваю класс с помощью отражающего метода getMethods()
. Две версии отличаются только типом возвращаемого значения. Это допустимо в коде JVM, но не разрешено в Java. Это не перегрузка метода, потому что отличается только тип возвращаемого значения, а тип возвращаемого значения не является частью сигнатуры метода.
Проблема может быть продемонстрирована с помощью простого кода:
Method[] methods = com.sun.tools.javac.tree.JCTree.JCClassDecl.class.getMethods();
for (int i = 0; i < methods.length; i++) {
System.out.println(methods[i]);
}
Он напечатает
...
public javax.lang.model.element.Name com.sun.tools.javac.tree.JCTree$JCClassDecl.getSimpleName()
public com.sun.tools.javac.util.Name com.sun.tools.javac.tree.JCTree$JCClassDecl.getSimpleName()
...
(Многоточие обозначает дополнительные строки вывода, показывающие различные другие методы, которые нам сейчас не интересны.)
Версия Java, которую я использовал для тестирования, это
$ java -version
java version "11" 2018-09-25
Java(TM) SE Runtime Environment 18.9 (build 11+28)
Java HotSpot(TM) 64-Bit Server VM 18.9 (build 11+28, mixed mode)
на машине с Windows 10.
ВОПРОС: Как был создан этот код класса? Насколько я понимаю, эта часть кода написана на Java, но на Java это невозможно. Также: какова цель иметь две версии метода с одинаковой сигнатурой? Намек?