JAVA / Бинарная совместимость в примерах и не только

Возможно, многие из вас задавались вопросами вроде «А что будет, если кто-то подложит к моему приложению неправильную версию библиотеки?». Вопрос хороший, а ответ на него и некоторые другие вы найдёте в этом топике. Для затравки задачка: пусть есть два интерфейса и класс, реализующий один из них:

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 из уже имеющегося класс-файла, является уже более сложным вопросом. Заинтересованы? Прошу под кат!

Глеб Петров

Доктор технических наук, член научно- аналитического совета Украинского ядерного общества.

Добавить комментарий