我正在尝试创建
HashMap
的子类,并具有自己的字符串表示形式。我想我只需要在子类中重写toString()
:
class Foo extends HashMap {
String toString() {
"foo"
}
}
这是可行的,只要我能做到
(new Foo()).toString()
,它就会返回字符串foo
。然而,在字符串插值上下文中(或使用 as String
时),toString
的 HashMap
实现似乎是规则:
Foo test = new Foo()
test["abc"] = 123
println "${test.toString()}" // Prints: foo
println "${test}" // Prints: [abc:123]
println (test as String) // Prints: [abc:123]
我很好奇为什么会发生这种情况,以及我可以做什么(如果有的话)来解决它?
这是一个通过的单元测试:
class JustTest extends Specification {
@TupleConstructor
class X<A,B> extends HashMap<A,B> {
String toString() {
return "CUSTOM".toString()
}
<T> T asType(Class<T> clazz) {
return switch (clazz) {
case String -> this.toString() as T
default -> throw new GroovyCastException("Error casting X to " + clazz.name)
}
}
}
def "Test"() {
setup:
X<Integer, Integer> x = new X()
x[100] = 200
expect:
assert x.toString() == "CUSTOM"
assert (x as String) == "CUSTOM"
}
}