Это имеет смысл.Предположим, что javac делает то, что вы хотите, он выбирает ваш assertEquals(MyObj, MyObj)
метод сегодня.Что если завтра org.junit.Assert
добавит свой собственный метод assertEquals(MyObj, MyObj)
?Значение заклинания assertEquals(mo1,mo2)
резко изменилось без вашего ведома.
Под вопросом стоит значение имени assertEquals
.Javac должен решить, что это имя метода (ов) в org.junit.Assert
.Только после этого он может выполнять разрешение перегрузки методов: изучить все методы в org.junit.Assert
с именем assertEquals
, выбрать наиболее подходящий.
Вполне возможно, что java может обрабатывать перегрузку методов из нескольких классов, однакокак показывает первый абзац, это вызывает большую неопределенность у разработчика, к какому классу вызывается метод.Поскольку эти классы не связаны, семантика метода может сильно отличаться.
Если во время компиляции нет никаких сомнений в том, что разработчик принадлежит к какому классу принадлежит метод, класс все еще может быть перегружен методом завтра, поэтому изменяется вызываемый целевой метод.Однако, поскольку это делается одним и тем же классом, мы можем считать его ответственным.Например, если org.junit.Assert
решит добавить новый метод assertEquals(MyObj, MyObj)
, он должен знать, что некоторые предыдущие вызовы assertEquals(Object,Object)
теперь перенаправлены в новый метод, и он должен убедиться, что нет изменений семантики, которые нарушатсайты вызова.