我会说是的,CompileStatic 意味着 TypeChecked。查看注释接口 TypeChecked 和 CompileStatic 的 groovy 源代码,我们看到:
// TypeChecked.java
@GroovyASTTransformationClass("org.codehaus.groovy.transform.StaticTypesTransformation")
public @interface TypeChecked {
和
// CompileStatic.java
@GroovyASTTransformationClass("org.codehaus.groovy.transform.sc.StaticCompileTransformation")
public @interface CompileStatic {
...
这告诉我们进行实际 AST 转换(注释的工作)的类是 StaticCompileTransformation 和 StaticTypesTransformation。
查看我们得到的代码:
// Transformation for TypeChecked
public class StaticTypesTransformation implements ASTTransformation, CompilationUnitAware {
和
// Transformation for CompileStatic
public class StaticCompileTransformation extends StaticTypesTransformation {
即CompileStatic 的转换扩展了TypeChecked 的转换,因此 CompileStatic 的行为似乎确实是 TypeChecked 行为的超集。
>
更深入地挖掘,我们看到转换类使用访问者模式,并且它们分别具有以下方法:
// StaticTypesTransformation, transformation for TypeChecked
protected StaticTypeCheckingVisitor newVisitor(SourceUnit unit, ClassNode node) {
return new StaticTypeCheckingVisitor(unit, node);
}
和
// StaticCompileTransformation, transformation for CompileStatic
protected StaticTypeCheckingVisitor newVisitor(final SourceUnit unit, final ClassNode node) {
return new StaticCompilationVisitor(unit, node);
}
它为每个案例返回一个自定义访问者类。
看着StaticCompilationVisitor我们看到:
public class StaticCompilationVisitor extends StaticTypeCheckingVisitor {
...
public void visitClass(final ClassNode node) {
...
super.visitClass(node);
...
}
...
}
换句话说,CompileStatic 的访问者类扩展了 TypeChecked 的访问者类,此外,CompileStatic 访问者中的 visitClass 方法(执行实际工作)调用 super.visitClass(node) 其中@ 987654343@ 是 TypeChecked 的访问者类。
我认为这或多或少地证明了这一点。 CompileStatic 的行为实际上是TypeChecked 行为的超集。