Вопрос из книги:Java 8 - по умолчанию методы - проблемы для унаследованного кода
В прошлом (до Java 8), вы сказали, что это плохая форма, чтобы добавить методы к интерфейсу, потому что это сломает существующий код. Теперь вам говорят, что добавлять новые методы легко, если вы также предоставляете реализацию по умолчанию.
- Насколько это безопасно? Опишите сценарий, в котором новый метод
stream
интерфейсаCollection
приводит к сбою компиляции устаревшего кода.- Что касается бинарной совместимости? Будет ли унаследованного кода из файла JAR-прежнему работать?»
Мои ответы таковы, но я не совсем уверен, что о них.
- Это безопасно, только если унаследованный код не обеспечивает метод с таким же именем
stream
и с той же подписью (например, в унаследованном классе, который реализуетCollection
). В противном случае этот старый устаревший код не скомпилирует. - Я думаю, что двоичная совместимость сохранена, старый код из старого JAR-файла все равно будет работать Но у меня нет никаких явных доводов в отношении s.
Может ли кто-либо подтвердить или отклонить эти ответы или добавить еще несколько аргументов, ссылок или ясности в эти ответы?
[Соответствующий] (http://stackoverflow.com/a/22618640/335858). – dasblinkenlight
Выполнение этой задачи при сохранении бинарной совместимости было основной мотивацией добавления методов по умолчанию к языку.Добавление стандартного к существующему методу является двоичным и совместимым с исходным кодом; добавление нового метода со значением по умолчанию является двоичным и совместимым с исходным кодом (по модулю взаимодействия с методами конфлирования в подклассах - это имеет идентичные характеристики совместимости с добавлением нового метода в класс, не являющийся конечным.) –
Хотя бинарная совместимость сохраняется, возникают проблемы, когда он взаимодействует с поведением библиотеки JRE, как в [этом сценарии] (http://stackoverflow.com/q/26816650/2711488). Вы также можете считать, что метод может иметь * совместимую * подпись, таким образом, начинает переопределять новый метод 'default', не намереваясь его ... – Holger