Причина, по которой они были добавлены, была частью добавления закрытий на Java, чтобы был простой путь обновления к таким вещам, как классы коллекции. Задача с добавлением закрытий - теперь есть множество функций, которые вы хотите добавить в стандартные коллекции. Однако, если вы добавите их в существующие интерфейсы, вы нарушите любые реализации этих интерфейсов. Этот способ заключается в добавлении дополнительного интерфейса с новыми методами. Это возможно без методов виртуального расширения, однако у него есть свой собственный недостаток. А именно, что добавление этого нового интерфейса должно быть добавлено до его использования. Поскольку сегодня, вероятно, много реализаций, может потребоваться много времени, чтобы обновить все эти реализации. Тем не менее, в то же время способ, которым вы хотите добавить методы, довольно несовместим с реализацией. Они должны делать в основном то же самое, по крайней мере, в базовом случае. То, как команда, которая построила это, решила обработать это дело, включала спецификацию поведения по умолчанию, которое можно было бы переопределить. Таким образом, с добавлением интерфейса есть функциональность, и разработчик библиотеки решает, что они хотят написать другую реализацию. Ключ, который им не нужен, или есть функциональность стоп-кадра, пока они этого не сделают.
Долгий срок, поскольку они в основном действуют как черты, и вы правы, они не то же самое, что и методы расширения на C#. Из того, что я читал, оригинальная реализация этого была больше C#. Тем не менее, решение использовать их таким образом из-за ограничений стиля (т. Е. Неспособных переопределить функциональность) и отсутствия возможности использовать отражение, обнаружить их. Кажется, что имя застряло, хотя подход к реализации изменился.
См. Статью write-up, в которой объясняются методы виртуального расширения, чтобы узнать подробности.
Это не скомпилировано. Существует Aspect Oriented Programming (AOP), которое звучит так, как вы хотите, но не это. – SJuan76
Должно? Вы используете Java-8? – sircodesalot
Нет, Java 7, который вышел последним. Если вы хотите обсудить Java 8, вы должны были указать это в вопросе. – SJuan76