我一直在将@TypeChecked和@CompileStatic添加到groovy代码中。
编译器接受这一点,但它是否是多余的?TypeChecked是否添加了CompileStatic没有添加的内容?这些文档似乎暗示CompileStatic是一个超集,但不要直截了当地说出来。我希望静态编译,同时偶尔禁用严格的类型检查,让groovy自动键入,同时仍然捕获拼写错误的引用或丢失的方法。
举个例子:
@TypeChecked
@CompileStatic
class MyClass {
void simple() {
// compiles fine statically
}
@TypeChecked(SKIP)
void complicated() {
// would require too many ugly typecasts
}
@CompileDynamic
void evenworse() {
// need time to untangle this
}
}我读过Difference between @TypeChecked and @CompileStatic,它没有回答这个具体的问题。它建议TypeCast允许一些额外的检查,但我不知道默认情况下它是否会执行额外的检查。
发布于 2019-04-18 07:24:08
我会说是的,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访问者调用super.visitClass(node)中的visitClass方法(它执行实际工作),其中super是TypeChecked的访问者类。
我认为这或多或少地证明了这一点。CompileStatic的行为实际上是TypeChecked行为的一个超集。
https://stackoverflow.com/questions/55717879
复制相似问题