为什么在构建Grails项目时@Override注释不起作用



我正在使用Grails 2.3.8构建系统来构建我的Grails项目(即在Gant之上构建的默认系统)。

当我使用 @java.lang.override 注释我的方法时,即使该方法在父类中没有覆盖任何内容,Grails 也不会编译失败。

当我直接使用 groovyc 编译时,一切正常。

是否有尚未启用的编译选项? :)

Grails 2.3.8 使用 Groovy 2.1.9。在那个版本的Groovy中,@Override注释在(至少)我使用它的情况下(最基本的情况)不被尊重:

class A {
        def foo() {}
}

class B extends A {
        @Override
        def foo(String s) {}
}

在该版本的Groovy(2.1.9)中,上面的代码编译得很好。

然后我下载了最新版本的Groovy(截至现在,2.4.1)并尝试编译相同的类。编译器如我预期的那样抛出了一个错误:

org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed:
foo.groovy: 7: Method 'foo' from class 'B' does not override method from its superclass or interfaces but is annotated with @Override.
 @ line 7, column 2.
        @Override
    ^
1 error

更新:实际上,即使是 Groovy 2.1.9 也有两种方式@Override:

  1. 如果访问修饰符不匹配(公共、受保护、私有)
  2. 如果方法返回类型不匹配

在遗留系统上升级Grails和Groovy时,此错误开始在很多地方发生。泛型类有一个在代码中被匿名覆盖的方法。问题是在实例化时,泛型类型没有填充。由于@Override以前没有获得荣誉,所以它奏效了。当我升级时,此错误开始发生。我修复了它,指定泛型类的类型。

例:

class Base<T> {
  void foo(T t) {}
}

对象被实例化如下:

def base = new Base() {
  @Override
  void foo(String string) {}
}

修复了指定泛型类的类型:

def base = new Base<String>() {
  @Override
  void foo(String string) {}
} 

另外,如果您在 @Override 上遇到问题,请检查该版本是否没有此错误。

最新更新