
Возможно, многие из вас задавались вопросами вроде
«А что будет, если кто-то подложит к моему приложению неправильную версию библиотеки?». Вопрос хороший, а ответ на него и некоторые другие вы найдёте в этом топике. Для затравки задачка: пусть есть два интерфейса и класс, реализующий один из них:
public interface A {
//...
}
public interface B {
//...
}
public class C implements A {
//...
}
А также класс, в котором есть метод
foo
, перегруженный для
A
и
B
. Этот метод вызывают от экземпляра класса
C
:
public class CompatibilityChecker {
public String foo(A a) {
return "A";
}
public String foo(B b) {
return "B";
}
public static void main(String[] args) {
CompatibilityChecker checker = new CompatibilityChecker();
System.out.println(checker.foo(new C()));
}
}
Вполне очевидно, что выведется «A». Не менее очевидно, что если сказать, что
C implements A, B
, то получится ошибка компиляции (
тем, кому последнее не очевидно, могу порекомендовать почитать про то, как происходит выбор методов. Например, в стандарте в разделе 15.12.2 или в более просто описывающих местах).
Но вот что произойдёт, если мы перекомпилируем только
C.java
, а потом запустим
CompatibilityChecker
из уже имеющегося класс-файла, является уже более сложным вопросом. Заинтересованы? Прошу под кат!