Eclipse Auto Complete: Java 1.7 Generics Diamond

Я только что обновился до Луны (от Кеплера), и я заметил небольшую (но раздражающую) проблему:
В автозавершении отсутствует возможность генерировать бриллианты "< > " для уже указанных генериков в переменной инициализации. Например, когда я печатаю:

Set<String> mySet = new HashSet 

Я бы ожидал, что он будет автоматически завершен до

Set<String> mySet = new HashSet<>();

а не

Set<String> mySet = new HashSet<String>();

Я использую JDK 1.7, а уровень соответствия также равен 1.7.

Также очень странно, что когда я ударяю STRG + Space несколько раз во время автозаполнения, пока он снова не вернется в java-автозаполнение, а затем нажмите Enter, он поставляет ожидаемые бриллианты.

Это очень похоже на ошибку. Является ли эта ошибка "известной" и есть ли какие-либо способы решения этой проблемы? Не удалось найти что-либо, связанное с этой темой.

Ответ 1

Скорее всего, вы установили плагин Code Recommenders. К сожалению, на этот плагин влияет ошибка # 435597, которая нарушает эту функциональность.

Эта ошибка появляется только в том случае, если у вас есть определенные типы предложений, включенные в "по умолчанию" список поддержки содержимого "(Eclipse Preferences > Java > Editor > Content Assist > Advanced). Например, я мог бы вернуть правильное поведение, отключив следующие типы предложений:

  • Основные предложения
  • Предложения JPA
  • Предложения шаблонов

(последний, скорее всего, наиболее раздражает, если вы используете шаблоны кода...)

Когда вы едете на велосипеде с помощью ctrl + space, вы фактически достигаете "предложений Java" (вместо "Интеллектуальные предложения Java (рекомендации для кода)" ), на которые эта ошибка не влияет.

Эта ошибка запланирована на версия 2.2.0 в июне 2015 года. Лучшее, что вы можете сделать на данный момент является:

  • Играйте с предложениями, чтобы проверить, какие из них запускают ошибку для вас (возможно, сделайте снимок экрана с вашей текущей настройки перед этим);
  • Голосовать для ошибка # 435597 и ошибка # 435660, чтобы зафиксировать их;
  • Предложить исправления для исправления этих ошибок: -)

Ответ 2

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

Set<String> mySet = new HashSet + CTRL + SPACE

Ответ 3

Эта функция алмаза введена в jdk 1.8, она не работает с jdk 1.7.
Таким образом, это новая функция, введенная оракулом.

Таким образом, это будет зависеть только от версии jdk на вашем компьютере, а не от версии ide.