我正在使用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:
- 如果访问修饰符不匹配(公共、受保护、私有)
- 如果方法返回类型不匹配
在遗留系统上升级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
上遇到问题,请检查该版本是否没有此错误。