在Groovy中强制陷入困境

时间:2012-12-07 03:25:10

标签: groovy

为什么以下

class Test {
  @Test
  void go() {
    def foo1 = new MockFoo1() as Foo
    def foo2 = new MockFoo2() as Foo
  }

  interface Foo {}

  class MockFoo1 {}

  class MockFoo2 {}
}

导致foo2胁迫java.lang.IllegalArgumentException: argument type mismatch

只有在单个执行路径中将2个不同类型的2个对象强制转换为同一个接口时才会发生这种情况。使用闭包或贴图来实现这种鸭子打字的常规批准方式很好。

任何光线都会受到赞赏。

1 个答案:

答案 0 :(得分:1)

这是ProxyGenerator adapterCache的错误。作为一种解决方法,您还可以使用一些Groovy技巧来完成这项工作:

interface Foo {
    static a = {
        [MockFoo1, MockFoo2].each {
            it.metaClass.asType = { Class klazz ->
                try {
                    DefaultGroovyMethods.asType(delegate, klazz)
                } catch (e) {
                    def cache = ProxyGenerator.INSTANCE.@adapterCache.@cache
                    cache.each { k, v ->
                        cache.remove(k)
                    }
                    DefaultGroovyMethods.asType(delegate, klazz)
                }
            }
        }
    }()
}

class MockFoo1 {}
class MockFoo2 {}

def a = new MockFoo1() as Foo
def b = new MockFoo2() as Foo

assert a instanceof Foo
assert b instanceof Foo

希望这有帮助!