0

为什么会出现以下

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

  interface Foo {}

  class MockFoo1 {}

  class MockFoo2 {}
}

导致java.lang.IllegalArgumentException: argument type mismatch对 foo2 的强制?

仅当我在单个执行路径期间将 2 个不同类型的 2 个对象强制到同一接口时,才会发生这种情况。使用闭包或映射来实现这种鸭子类型的常规认可方式效果很好。

任何光线都表示赞赏。

4

1 回答 1

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

希望这可以帮助!

于 2013-06-11T07:14:34.090 回答