У меня есть следующий класс в общей банке:
public class Common
{
public Common(List list)
{
...
}
}
Затем я изменяю параметр конструктора с List
на Collection
следующим образом:
public class Common
{
public Common(Collection collection)
{
...
}
}
Восстановление общего jar и запуск системы вызывает NoSuchMethodError
в любом зависимом классе, когда он вызывает конструктор, пока я не перекомпилирую этот класс.
У меня есть несколько идей, что вызывает это, в соответствии с тем, как конструктор связан с байт-кодом зависимого класса, но я не уверен на 100%.
Пожалуйста, кто-нибудь может пролить свет на то, что здесь происходит?
Обновление
Впоследствии я сделал быстрый тест и посмотрел на байт-код:
Compiled from "Client.java"
public class Client extends java.lang.Object{
public Client();
Code:
0: aload_0
1: invokespecial #1; //Method java/lang/Object."<init>":()V
4: return
public static void main(java.lang.String[]);
Code:
0: new #2; //class ArrayList
3: dup
4: invokespecial #3; //Method java/util/ArrayList."<init>":()V
7: astore_1
8: new #4; //class Common
11: dup
12: aload_1
13: invokespecial #5; //Method Common."<init>":(Ljava/util/List;)V
16: pop
17: return
}
Как сказал Том, и как вы можете видеть в строке 13, точный конструктор привязан во время компиляции.
Вы узнаете что-то новое каждый день: -)