我无法理解以下代码段产生的错误:
import groovy.transform.CompileStatic
@CompileStatic
trait FooTrait {
void foo() {
bar()
}
private abstract void bar() // private access modifier causes error
}
使用private
访问修饰符时会生成以下编译器错误:
[Static type checking] - Non static method FooTrait$Trait$Helper#bar
cannot be called from static context
答案 0 :(得分:1)
这是当前限制as described here
此问题特定于
@CompileStatic
。让我解释一下。
在特征中定义静态方法时,静态方法不属于特征。相反,它将被复制到实现特征的类。所以在特征本身上,静态
someStaticMethod
没有定义。要使其工作,您必须知道将要实现特征的类,就像您对普通静态方法调用一样:SomeClassImplementingTrait.someStaticMethod() // here, someStaticMethod is defined
没有简单的方法来解决这个问题,如果没有动态调用任何方法调用特征内的“this”,静态或不静态。