Groovy-карты с целочисленными ключами - 'getAt' в DefaultGroovyMethods не может быть применен (java.lang.Integer) - PullRequest
0 голосов
/ 06 июня 2018

Я только начал практиковать Groovy, и у меня есть вопрос, связанный с картами и IDEA IDE.

Почему IDEA показывает мне уведомление ниже, когда я пытаюсь использовать Integer в качестве ключа для карты?Этот простой скрипт Groovy отлично работает и выдает правильный результат.

screenshot

list = [4, 7, 3, 7, 7, 1, 4, 2, 4, 2, 7, 5]

map = [:]
list.each {
    t = map[(it)]
    map[(it)] = t != null ? t + 1 : 1
}

map.each {key, value -> if (value == 1) println key}

1 Ответ

0 голосов
/ 06 июня 2018

Это вызвано тем, что IntelliJ IDEA видит map переменную как Object - похоже, что IDEA не следует за выводом типа, если статический тип или ключевое слово def отсутствуют перед переменной.Если вы посмотрите на DefaultGroovyMethods, то увидите, что для типа Object реализован только один метод getAt:

public static Object getAt(Object self, String property) {
    return InvokerHelper.getProperty(self, property);
}

Именно поэтому IDEA предупреждает вас о пропущенном методе getAt(Object self, Integer property), потому чтоон не знает, что map на самом деле Map, а не Object.

Пожалуйста, следуйте официальному руководству Groovy, которое гласит:

Переменные могут быть определены с помощьюлибо их тип (например, String), либо с помощью ключевого слова def:

String x
def o

Источник: http://docs.groovy -lang.org / latest / html /Документация / core-semantics.html # _variable_definition

Если вы определите свою переменную как

def map = [:]

IntelliJ больше не будет жаловаться.

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