我有三个Groovy类:M,A和& B. B作为M的混合物和抽象类A的扩展存在:
class M {
def foo = 11
def bar = 12
}
abstract class A {
abstract foo
}
@Mixin(M)
class B extends A {
}
def b = new B()
print "${b.foo}\n"
print "${b.bar}\n"
尝试运行此操作会导致Groovy抱怨:
Can't have an abstract method in a non-abstract class. The class 'B' must be declared abstract or the method 'void setFoo(java.lang.Object)' must be implemented.
但是,该方法由mixin M实现。
此外,如果我将B改为:
@Mixin(M)
class B extends A {
def foo = 13
}
然后我得到了打印输出:
11
12
而不是:
13
12
我期望并且似乎证明M提供了A的抽象方法的可接受实现。
那么,为什么不熟练使用mixin M来满足抽象类A,我做错了什么?
答案 0 :(得分:1)
你没有做错任何事。这是编译器在实际应用AST转换之前执行此检查的问题。您最好在http://jira.codehaus.org/secure/BrowseProject.jspa?id=10242的问题跟踪器上发布此信息。
由于@Mixin转换实际上是由Groovy ++ AFAIK的作者创建的,并且由于Groovy ++对类别,混合和特性有更多的扩展支持,因此您可以期望这是一个有效的代码。你应该试试看。