Некоторое время назад Oracle решила, что добавление Closures в Java 8 будет хорошей идеей. Интересно, как там решаются проектные проблемы по сравнению с Scala, которые были закрыты с первого дня.
Ссылаясь на Открытые проблемы из javac.info:
-
Можно использовать дескрипторы методов для типов функций? Не ясно, как это сделать. Одна из проблем заключается в том, что метод обрабатывает параметры типа reify, но таким образом, который мешает подтипированию функций.
-
Можем ли мы избавиться от явного объявления параметров типа "throws"? Идея заключалась бы в использовании вывода disjuntive type, когда объявленная граница является проверенным типом исключения. Это не является строго обратной совместимостью, но вряд ли может нарушить реальный существующий код. Мы, вероятно, не можем избавиться от "бросков" в аргументе типа, однако, из-за синтаксической двусмысленности.
-
Запретить @Shared по переменным индекса цикла в старом стиле
-
Обработать интерфейсы, такие как Comparator, которые определяют более одного метода,, но один из них будет реализован методом, унаследованным от Object. Определение "интерфейс с одним методом" должно учитывать только методы, которые не были бы реализованы методом в Object, и должны считать несколько методов одним, если реализация одного из них будет реализовывать их все. В основном это требует более точной спецификации того, что означает, что интерфейс имеет только один абстрактный метод.
-
Укажите сопоставление типов функций с интерфейсами: имена, параметры и т.д. Мы должны полностью точно указать отображение типов функций на системно-генерируемые интерфейсы.
-
Вывод типа. Правила для вывода типа должны быть дополнены для размещения вывода параметров типа исключения. Аналогично, отношения подтипов, используемые преобразованием замыкания, также должны быть отражены.
-
Параметры исключенного типа исключения, которые помогают модифицировать прозрачность исключений. Возможно, что параметры исключенного типа исключения означают оценку. Это позволяет дооснащать существующие общие интерфейсы, которые не имеют параметра типа для исключения, например java.util.concurrent.Callable, добавляя новый общий параметр исключения.
-
Как формируются литералы классов для типов функций? Это #void(). Class? Если да, то как это работает, если типы объектов стираются? Это #? (?). Class?
-
загрузчик системного класса должен динамически генерировать интерфейсы типа функций. Интерфейсы, соответствующие типам функций, должны генерироваться по требованию загрузчиком класса bootstrap, поэтому они могут быть разделены между всеми пользовательскими кодами. Для прототипа мы можем создать javac эти интерфейсы, так что код, созданный прототипом, может работать на виртуальных машинах (JDK5-6).
-
Должна ли оценка лямбда-выражения каждый раз создавать свежий объект? Надеюсь, что нет. Например, если лямбда не захватывает никаких переменных из охватывающей области, ее можно назначить статически. Аналогичным образом, в других ситуациях лямбда может быть перемещена из внутреннего цикла, если она не захватывает какие-либо переменные, объявленные внутри цикла. Поэтому было бы лучше, если бы спецификация promises ничего о ссылочном идентификаторе результата выражения лямбда, поэтому такая оптимизация может быть выполнена компилятором.
Насколько я понимаю 2., 6. и 7. не проблема в Scala, потому что Scala не использует Checked Exceptions как своего рода "Shadow type-system", например Java.
Как насчет остальных?