在字符串插值上下文中重写 HashMap.toString()

问题描述 投票:0回答:1

我正在尝试创建

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]

我很好奇为什么会发生这种情况,以及我可以做什么(如果有的话)来解决它?

groovy hashmap overriding string-interpolation
1个回答
0
投票

这是一个通过的单元测试:

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"
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.