当父对象为Map或Collection时,Groovy GString呈现不会调用重写的toString()方法
以下是最简单的演示案例:当父对象为Map或Collection时,Groovy GString呈现不会调用重写的toString()方法,groovy,gstring,Groovy,Gstring,以下是最简单的演示案例: class T extends HashMap { @Override String toString() { return "foo" } } def t = new T() println t.toString() println "${t}" 输出是 foo [:] 因此,@Override-toString()从未执行以获取GString中的值。我应该把断点放进去吗?它从来没有停过。我是遗漏了什么还是一个bug?除了HashMap和C
class T extends HashMap {
@Override
String toString() {
return "foo"
}
}
def t = new T()
println t.toString()
println "${t}"
输出是
foo
[:]
因此,
@Override-toString()
从未执行以获取GString
中的值。我应该把断点放进去吗?它从来没有停过。我是遗漏了什么还是一个bug?除了HashMap
和Collection
之外,它似乎工作正常。GString
不直接调用Map.toString()
,而是调用
InvokeHelper.write(Writer out, Object object)
放置断点并查看发生了什么:
我从调试会话中录制了一段短视频,向您展示了将此对象放入GString时发生的确切情况:
我希望这能有所帮助。谢谢你的详细解释,现在事情已经很清楚了。尽管我仍然在考虑未回答的问题,因为对我来说,还不清楚是预期的行为(如果是这样的话)或者听起来像是一个Groovy bug。我很惊讶
instanceof Map
给我true
至于Java中的子类,你总是必须使用isAssignableFrom()
。我感到惊讶的是,我不再能够将映射为Groovy中的对象,并根据需要使用继承来定制它的行为。无论如何,有没有一个解决办法?我想我通过使用println“${(String)t}”找到了一个解决办法
将强制它转换为字符串,该字符串将在GString
开始渲染之前调用toString()
。您可以直接调用t.toString()
,而无需转换。它不会更改GString
内部的渲染顺序,它会更改GString
即将渲染的类型-现在它看到的是String
,而不是Map
,因此它会按原样进行渲染。