1

我正在尝试使用 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>它就可以了。

关于如何使第一个版本工作的任何想法?

谢谢

4

1 回答 1

2

像这样进行直接强制转换的问题在于Map,重新定义get的已经是 a并且在Groovy 源Map强制转换中有一个检查,说明如果你想要做的是将类似 a 的东西强制转换为 a然后只是正常转换它而不是尝试根据需要为接口创建代理。MapMap

为了解决这个问题,您可以使您的模拟对象的类型不同于Map,例如Expando,然后它将强制转换为您的接口类型:

Map<String, String> map = new Expando([get: {String  k -> "echo"}]) as Map<String, String>
assert map.get('a') == 'echo'
于 2012-03-05T23:57:02.120 回答