为什么以下
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个对象强制转换为同一个接口时才会发生这种情况。使用闭包或贴图来实现这种鸭子打字的常规批准方式很好。
任何光线都会受到赞赏。
答案 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
希望这有帮助!