Проблема с таким прямым принуждением заключается в том, что 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'