Eclipse не предлагает методы в лямбда-выражении - PullRequest
2 голосов
/ 06 августа 2020

У меня есть ArrayList из String s, и я добавляю метод для сортировки ArrayList

list.sort(Comparator.comparing(x -> x.length()));

Когда я пишу x и нажимаю ctrl + space eclipse выполняет не предлагает методы класса String, а показывает только методы класса Object. введите описание изображения здесь

Пожалуйста, помогите мне настроить eclipse, чтобы показать точные предложения метода в этом случае. В обычных случаях затмение точное.

1 Ответ

0 голосов
/ 06 августа 2020

Это двойная проблема: одна с 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 в этом отношении) приходится труднее. Это связано с тем, что лямбда-выражения работают путем вывода большого количества неявной информации, которую в противном случае нужно было бы записать явно (например, в явной реализации интерфейса).

Если все остальное не удается, вы может создать явный интерфейс в этой позиции, а затем преобразовать его в лямбду после его завершения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...