Я предполагаю, что вы используете "двоичную несовместимость" в техническом смысле; например где загрузчик классов обнаруживает несовместимость и отказывается загружать классы.
Двоичная несовместимость также может быть введена, если вы добавили видимый метод и объявили его final
, и этот метод столкнулся с сигнатурой какого-либо существующего метода в стороннем подклассе. Однако, если метод не является окончательным, существующий метод превратится в переопределение вашего (нового) метода, что может вызвать проблемы ... но не двоичную несовместимость.
Аналогичным образом, добавление новых видимых полей приведет к скрытию, может привести к сбивающему с толку поведению и нарушит сериализацию объекта. Но это не приведет к двоичной несовместимости.
В целом это указывает на то, что вам необходимо учитывать семантические проблемы приложения, а также простую двоичную совместимость. И система типов Java вам там не поможет.
Для полноты, есть другие вещи, которые вы могли бы сделать в своем коде, которые нарушали бы двоичную совместимость для сторонних классов:
- уменьшить видимость вашего абстрактного класса и / или его методов,
- изменить сигнатуры других классов, используемых в качестве параметров-результатов и типов исключений,
- изменить цепочку суперклассов, которую расширяет ваш абстрактный класс, или внести несовместимые изменения в эти классы, или
- измените дерево интерфейсов, которые реализует ваш абстрактный класс, или внесите несовместимое изменение в эти интерфейсы.