Это двойная проблема: одна с eclipse, а другая с семантикой java.
Java Семантика
Быстрый пример:
public static void main(String[] args) {
List<String> myList = new ArrayList<>();
myList.sort(Comparator.comparing(x -> x.|));
}
Предположим, вы нажали ctrl
+ space
в позиции |
(курсор). Затем eclipse должен вывести много информации, чтобы знать, что x на самом деле является элементом типа String
. Во-первых, должен быть известен общий c тип String
списка (то есть eclipse может это сделать). Затем метод Comparator.comparing
должен знать, что он должен возвращать экземпляр Comparator, который сравнивает String
s, которые может вывести eclipse, но вот первая проблема: Comparator может быть тем, который сравнивает не только строки, но и а также любые другие Object
. Что, если вы хотите передать метод myList.sort
более общий, чем generi c Comparator<String>
? Чтобы быть более точным: метод List.sort
может принимать (в вашем случае) любой Comparator
типа Comparator<? super String>
. А ? super String
уже равно Object
или String
. Итак, в вашем примере. тип x
может быть просто объектом, eclipse не может окончательно решить. Однако вы можете написать свое лямбда-выражение по-другому, чтобы было понятнее:
myList.sort(Comparator.comparing((String x) -> x.|));
В этом случае предложение завершения может быть более полезным (в зависимости от версии eclipse).
Проблемы AST eclipse с неполными лямбда-выражениями
Неполное лямбда-выражение чаще всего вызывает такое нарушение синтаксиса всего файла, что eclipse не может правильно определить дерево синтаксиса в этой позиции. Это означает, что eclipse не может сделать вывод, что код, который вы пишете, должен быть лямбда-выражением, где x
- параметр лямбда-функции, и вы хотите завершить это. Эту проблему можно решить, если соответствующим образом адаптировать токенизатор и AST-парсер eclipse (что, возможно, уже было опробовано). Возможно ли это вообще, я не могу ответить. Я знаю только, что это помогает, написать «полную» лямбду с блоком метода и преобразовать ее в «тонкую» лямбду позже:
myList.sort(Comparator.comparing((String x) -> { return x.| }));
В приведенном выше случае завершение должно работать ( IF вы указываете String
как абсолютный тип Comparator
, как я сделал в примере).
Подобные проблемы возникают из-за вопроса о том, как интерпретировать символы и поэтому сделайте вывод, что программист мог бы намереваться написать (процесс автоматического завершения и предложение завершения). eclipse очень сильно изолирует ссылку на именованный объект в обычном коде, таком как блок метода, for
l oop или любую другую конструкцию. Поэтому там хорошо работает. Тогда синтаксическое дерево обычно легко обрабатывать.
Однако при использовании лямбда-выражений eclipse (и любой другой IDE в этом отношении) приходится труднее. Это связано с тем, что лямбда-выражения работают путем вывода большого количества неявной информации, которую в противном случае нужно было бы записать явно (например, в явной реализации интерфейса).
Если все остальное не удается, вы может создать явный интерфейс в этой позиции, а затем преобразовать его в лямбду после его завершения.