Java лямбда-выражения (JSR 335): зачем "исключать поддержку несвязанных ссылок на конструкторы внутренних классов"?
В текущем проекте JSR 335 в записи журнала изменений для 0.6.0 упоминается, что он "исключил поддержку несвязанных ссылок на конструкторы внутренних классов".
Для иллюстрации предположим, что у вас есть внешний класс с именем A
и внутренний класс с именем B
и вы хотите функцию, которая принимает A
и создает новый B
пример:
Function<A, A.B> foo = a -> a.new B();
До версии 0.6.0 вы также можете использовать синтаксис ссылки на конструктор, чтобы сделать то же самое (это даже задокументировано в State of Lambda):
Function<A, A.B> foo = A.B::new;
Как упомянуто выше, этот синтаксис больше не поддерживается в 0.6.0. Мне действительно любопытно узнать почему.
Я просмотрел архивы для lambda-spec-experts
а также lambda-dev
списки рассылки, и не могу найти какую-либо информацию об этом.
0 ответов
Очевидно, что "new" - это ключевое слово, а не метод, и что любое использование "new" как метода является особым случаем в компиляторе. Я легко могу представить, что они хотели очистить компилятор от наименее вероятных случаев использования, которые имеют тривиальные обходные пути.
Предположение: возможно, есть также некоторые коллизии / неясности, которые нужно разрешить с предстоящим JLS, о котором мы пока не знаем, и это переходное изменение для минимизации регрессий. Через 5-6 лет после вашего вопроса, вы вообще страдаете от этого изменения? лол