Сегодня я столкнулся с интересной проблемой, которая, по моему мнению, была невозможна в Java.Я скомпилировал свой java-код для jgroups версии 2.6, но использовал версию 2.12 во время выполнения (развертывание веб-приложения tomcat).Я получил следующую ошибку
org.jgroups.Message.<init>(Lorg/jgroups/Address;Lorg/jgroups/Address;Ljava/io/Serializable;)
Предполагая, что API с тех пор изменится, я подумал о переносе своего кода в jgroups-2.12, но, к моему удивлению, код скомпилирован нормально с jgroups-2.12, и когда язаменил новый jar (не меняя ни одной строки в моем коде, просто компилируя против jgroups-2.12 вместо jgroups-2.6), он работал отлично.
Позже я понял, что конструктор Message(Address, Address, Serializable)
в 2.6 былизменено на Сообщение (Адрес, Адрес, Объект) в 2.12.Это означает, что во время выполнения JVM пыталась найти точно такой же метод и не смогла это сделать.
Означает ли это, что компилятор Java в процессе компиляции встраивает точное имя метода и точные аргументы, а также метод с более широкими аргументамине сработает?