我正在尝试使用 groovy map coercion 来模拟 Map。我尝试了以下代码的各种变体,但结果始终为空。
Map<String, String> map = [get: {String k -> "echo"}] as Map<String, String>
println map.get("a")
如果我使用map = {"echo"} as Map<String, String>
它就可以了。
关于如何使第一个版本工作的任何想法?
谢谢
像这样进行直接强制转换的问题在于Map
,重新定义get
的已经是 a并且在Groovy 源Map
强制转换中有一个检查,说明如果你想要做的是将类似 a 的东西强制转换为 a然后只是正常转换它而不是尝试根据需要为接口创建代理。Map
Map
为了解决这个问题,您可以使您的模拟对象的类型不同于Map
,例如Expando
,然后它将强制转换为您的接口类型:
Map<String, String> map = new Expando([get: {String k -> "echo"}]) as Map<String, String>
assert map.get('a') == 'echo'