У меня есть три класса 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.
Однако этот метод реализуется миксином M.
Кроме того, если я изменю B на:
@Mixin(M)
class B extends A {
def foo = 13
}
Затем я получаю распечатку:
11
12
И не:
13
12
Это то, что я ожидаю и, кажется, доказывает, что M обеспечивает приемлемую реализацию абстрактных методов A.
Итак, почему groovy не устраивает использование примеси M для удовлетворения абстрактного класса A, что я делаю неправильно?