Groovy рендеринг GString не вызывает переопределенный метод toString(), когда parent является Map или Collection

Вот минимальный демонстрационный пример:

class T extends HashMap {
  @Override
  String toString() {
    return "foo"
  }
}

def t = new T()
println t.toString()
println "${t}"​

Выход

foo
[:]

Итак @Override toString() никогда не выполняется для получения значения в течение GString, Должен ли я поставить точку останова внутри, она никогда не остановилась Я что-то упустил или это ошибка? Кроме как HashMap а также Collection Кажется, работает нормально.

1 ответ

GString не звонит Map.toString() прямо и вместо этого он вызывает

InvokeHelper.write(Writer out, Object object)

Поставьте точку останова здесь и посмотрите, что произойдет:

Я записал небольшое видео из сеанса отладки, чтобы показать вам, что именно происходит, когда этот объект помещается в GString:

https://youtu.be/HYHdfmwd-lw

Я надеюсь, что это помогает.

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