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 лет после вашего вопроса, вы вообще страдаете от этого изменения? лол

Другие вопросы по тегам