Как смоделировать java.util.Map в Groovy, используя приведение карты? - PullRequest
1 голос
/ 06 марта 2012

Я пытаюсь смоделировать Карту, используя принудительное приведение карты.Я пробовал различные варианты кода ниже, но результат всегда был нулевым.

Map<String, String> map = [get: {String  k -> "echo"}] as Map<String, String>

println map.get("a")

Если я использую map = {"echo"} as Map<String, String>, это сработает.

Есть идеи, как заставить работать первую версию?

спасибо

1 Ответ

2 голосов
/ 06 марта 2012

Проблема с таким прямым принуждением заключается в том, что Map, который переопределяет get, уже является Map, и есть проверка в Groovy source принуждении, которое говорит, что если вы 'Попытка сделать это - принудить что-то вроде Map в Map, а затем просто привести его как обычно, вместо того, чтобы пытаться создать прокси для интерфейса, как вы хотите.

Чтобы обойти это, вы можете сделать ваш фиктивный объект другого типа, чем Map, например Expando, тогда он будет приведен в тип вашего интерфейса:

Map<String, String> map = new Expando([get: {String  k -> "echo"}]) as Map<String, String>
assert map.get('a') == 'echo'
...