首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >groovy @CompileStatic是否意味着@TypeChecked?

groovy @CompileStatic是否意味着@TypeChecked?
EN

Stack Overflow用户
提问于 2019-04-16 23:28:54
回答 1查看 460关注 0票数 1

我一直在将@TypeChecked@CompileStatic添加到groovy代码中。

编译器接受这一点,但它是否是多余的?TypeChecked是否添加了CompileStatic没有添加的内容?这些文档似乎暗示CompileStatic是一个超集,但不要直截了当地说出来。我希望静态编译,同时偶尔禁用严格的类型检查,让groovy自动键入,同时仍然捕获拼写错误的引用或丢失的方法。

举个例子:

代码语言:javascript
复制
@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允许一些额外的检查,但我不知道默认情况下它是否会执行额外的检查。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-04-18 07:24:08

我会说是的,CompileStatic意味着TypeChecked。查看注释接口TypeCheckedCompileStatic的groovy源代码,我们看到:

代码语言:javascript
复制
// TypeChecked.java
@GroovyASTTransformationClass("org.codehaus.groovy.transform.StaticTypesTransformation")
public @interface TypeChecked {

代码语言:javascript
复制
// CompileStatic.java
@GroovyASTTransformationClass("org.codehaus.groovy.transform.sc.StaticCompileTransformation")
public @interface CompileStatic {
...

这告诉我们,执行实际AST转换(注释的工作)的类是StaticCompileTransformationStaticTypesTransformation

看看我们得到的代码:

代码语言:javascript
复制
// Transformation for TypeChecked
public class StaticTypesTransformation implements ASTTransformation, CompilationUnitAware {

代码语言:javascript
复制
// Transformation for CompileStatic
public class StaticCompileTransformation extends StaticTypesTransformation {

也就是说,CompileStatic的转换扩展了TypeChecked的转换,因此似乎CompileStatic的行为实际上是TypeChecked行为的一个超集。

<<编辑>>

更深入地研究,我们看到转换类使用访问者模式,并且它们分别具有以下方法:

代码语言:javascript
复制
    // StaticTypesTransformation, transformation for TypeChecked
    protected StaticTypeCheckingVisitor newVisitor(SourceUnit unit, ClassNode node) {
        return new StaticTypeCheckingVisitor(unit, node);
    }

代码语言:javascript
复制
    // StaticCompileTransformation, transformation for CompileStatic 
    protected StaticTypeCheckingVisitor newVisitor(final SourceUnit unit, final ClassNode node) {
        return new StaticCompilationVisitor(unit, node);
    }

为每种情况返回一个自定义访问者类。

看看我们看到的StaticCompilationVisitor

代码语言:javascript
复制
public class StaticCompilationVisitor extends StaticTypeCheckingVisitor {
    ...
    public void visitClass(final ClassNode node) {
        ...
        super.visitClass(node);
        ...
    }
    ...
}

换句话说,CompileStatic的访问者类扩展了TypeChecked的访问者类,此外,CompileStatic访问者调用super.visitClass(node)中的visitClass方法(它执行实际工作),其中superTypeChecked的访问者类。

我认为这或多或少地证明了这一点。CompileStatic的行为实际上是TypeChecked行为的一个超集。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55717879

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档