Groovy中的特征改变了类类型的兼容性?



我的测试代码如下:

trait Behavior {
}
class Dog {
def greet() {
println 'Hi, I am a dog.'
}
}
def foo(Dog dog) {
dog.greet()
}
def dog = new Dog() as Behavior
dog.greet()
foo(dog)

它给出的错误如下:

Hi, I am a dog.
Caught: groovy.lang.MissingMethodException: No signature of method: test2.foo() is applicable for argument types: (Dog1_groovyProxy) values: [Dog1_groovyProxy@48f278eb]
Possible solutions: foo(Dog), run(), run(), any(), find(), use([Ljava.lang.Object;)
groovy.lang.MissingMethodException: No signature of method: test2.foo() is applicable for argument types: (Dog1_groovyProxy) values: [Dog1_groovyProxy@48f278eb]
Possible solutions: foo(Dog), run(), run(), any(), find(), use([Ljava.lang.Object;)
at test2.run(test2.groovy:18)

为什么特质会改变"狗"的类类型?当它实现特征"行为"时,它不会是类狗的实例吗?调用"foo"方法会产生错误。

特征改变类类型兼容性不像"实现"?

as此处将实例类型更改为Behavior,如文档中所述

当强制对象到特征时,操作的结果不是相同的实例。可以保证强制对象将同时实现原始对象实现的特征和接口,但结果不会是原始类的实例。

最新更新