openlang

Вызов Java encode() из Groovy с null = ambiguous method, а на стороне Java всё нормально

Перенёс цикл экспорта CSV с Java на Groovy, и теперь задача падает на строке, где нет nickname. В Java FieldEncoder три перегрузки encode (String, Number, Collection), и null должен превращаться в токен NULL. В старом Java-коде encoder.encode(user.getNickname()) с null работает нормально.

Сторона Groovy:

def cells = COLUMNS.collect { col -> encoder.encode(row[col]) }

В строке 3 нет ключа nickname. Первая строка ошибки говорит про ambiguous method overloading, а список аргументов — [null]. Я вывожу row[col] и там null, так что map выглядит нормально. Ещё менял nullToken, разницы нет.

Groovy 4.0.22 возвращает что-то странное для отсутствующего ключа или не поддерживает опцию с null-токеном? Почему Java справляется с null здесь, а Groovy нет?

Спасибо за любую помощь.

Переведено с английскогоПоказать оригинал

Разговор продолжается 3

Следуя доводам
  1. Ссылка на ответ

    Java выбирает перегрузку на этапе компиляции по статическому типу, здесь это String, поэтому null не проблема. Groovy диспетчеризует в рантайме, и голый null одинаково подходит под String, Number и Collection. Приведите тип: encoder.encode((String) row[col]). Или добавьте перегрузку encode(Object).

    Переведено с английскогоПоказать оригинал
  2. Ссылка на ответ

    imke права. Groovy ничего странного не возвращает, null в рантайме это просто null. Приведите тип или используйте row[col] as String. Сталкивался с тем же в Gradle-скрипте, который вызывает мой Java-хелпер. Бесит. Я бы добавил encode(Object) и обрабатывал null там, чтобы место вызова осталось чистым.

    encoder.encode(row[col] as String)
    Переведено с английскогоПоказать оригинал

Другие стороны того же вопроса

  1. List<Int> только для чтения - это снимок?

    List<Int> всего лишь представление только для чтения, а не снимок. Он сообщает потребителю, какие операции доступны через эту…

    Ответы 4Последняя активность kotlin
  2. Приватные кейсы union, smart constructor, а после remove всё равно `Colors []`?

    Всем привет, У меня небольшой редактор образцов цвета с union из трёх кейсов для палитры. Свежая правка — NotEntered, намерен…

    Ответы 1Последняя активность fsharphaskell
  3. Единицы измерения как дешёвые идентификаторы

    Для целочисленных идентификаторов я пробую единицы измерения вместо объединений с одним случаем, и хочется услышать второе мн…

    Ответы 1Последняя активность fsharp