Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
当父对象为Map或Collection时,Groovy GString呈现不会调用重写的toString()方法_Groovy_Gstring - Fatal编程技术网

当父对象为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
,因此它会按原样进行渲染。