Groovy Mixins能否满足抽象类要求?

时间:2011-10-17 22:51:36

标签: groovy abstract-class mixins

我有三个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,我做错了什么?

1 个答案:

答案 0 :(得分:1)

你没有做错任何事。这是编译器在实际应用AST转换之前执行此检查的问题。您最好在http://jira.codehaus.org/secure/BrowseProject.jspa?id=10242的问题跟踪器上发布此信息。

由于@Mixin转换实际上是由Groovy ++ AFAIK的作者创建的,并且由于Groovy ++对类别,混合和特性有更多的扩展支持,因此您可以期望这是一个有效的代码。你应该试试看。