Groovy中的强制混淆

Groovy中的强制混淆,groovy,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:参数类型不匹配 只有在一条执行路

为什么会出现以下情况

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:参数类型不匹配

只有在一条执行路径期间,我将两个不同类型的对象强制到同一接口时,才会发生这种情况。groovy认可的使用闭包或映射来实现这种duck类型的方法工作得很好


任何光线都值得欣赏。

这是ProxyGenerator的一个bug
适配器缓存
。作为一种解决方法,您还可以使用一些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

希望这有帮助

对我来说好像是个虫子。。。吉拉,也许吧?哦,真的。然后我会记录一个bug。谢谢,这是什么错误号?