我使用Grails 2.3.8构建系统来构建我的Grails项目(即在Gant之上构建的默认系统)。
当我用@ java.lang.Override注释我的方法时,即使该方法在父类中没有覆盖任何内容,Grails也不会编译失败。
当我使用groovyc直接编译时,一切正常。
我是否启用了编译选项? :)
答案 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 :(得分: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。