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

时间:2015-01-16 02:07:07

标签: grails groovy

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

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

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

我是否启用了编译选项? :)

2 个答案:

答案 0 :(得分:6)

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

UPDATE:实际上有两种方法可以使Groovy 2.1.9荣幸@Override:

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

答案 1 :(得分:0)

补充@vahid-pazirandeh 的回答。

当在遗留程序上升级 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 时遇到问题,请检查您的版本是否没有 this bug