Eclipseは、インターフェイスのメソッドを実装するときに@Overrideアノテーションを追加しています。 Eclipseはこれに問題がないようです。また、Cruise Controlの自動化されたビルドプロセスでは、これに問題はないようです。しかし、antをjavacで実行してコマンドラインからビルドすると、このエラーが発生します。
[javac] C:\path\project\src\com\us\MyClass.Java:70: method does not override a method from its superclass
[javac] @Override
[javac] ^
[javac] 1 error
EclipseはJava 1.6。Cruise Controlが実行されていますJava 1.5。Java =使用します。
@Override
注釈仕様がJava 1.6で変更されました。Java 1.5では、コンパイラは@Override
実装されたインターフェースメソッドの注釈ですが、1.6ではそうです。私が最初に見つけた検索結果は、 ブログ投稿はこちら です。それは 十分に文書化されていませんでした ですが、変更されました。
Eclipseは1.6準拠に設定されているため、Eclipseが追加しています。同じバージョンのJavaでビルド環境とEclipse環境を維持するようにしてください。 Cruise Control is running Java 5別のJDK6を使用してコンパイルしているかどうかを指定することによって、私にはわかりません。
上記の1.5対1.6 @Override
アノテーションルール。Eclipseには(javac
ではなく)独自のコンパイラ実装があり、動作が異なる場合があることに注意してください。何かがEclipseでコンパイルされ、AntやMavenではコンパイルされない場合は、両方のコンパイラーを満足させる方法を見つける必要があります。
私はあなたが見ている問題を本当に説明することはできませんが、JDK 5は_@Override
_を許可しないという事実に関連しているようですインターフェイスの実装されたメソッド、スーパークラスに存在するオーバーライドされたメソッドのみ。
JDK 6は、それらのいずれに対しても_@Override
_を許可します。
Antビルドが失敗した場合、source
パラメーターをjavacに渡して、JDK 5準拠を求めている可能性があります。
メソッド実装のコンテキストで@Overrideが使用されているときにjavacによってエラーが発生する「なぜ」という質問に対する直接的な答えは、実際にはJava仕様にあります。
」の理由は、インターフェイスを実装する具体的なクラスは、@ Overrideアノテーションに関係なく、すべてのインターフェイスのメソッドを必ずオーバーライドするため、このアノテーションのセマンティクスを持つのは混乱することですインターフェイスを実装するためのルールと対話します。」
http://Java.Sun.com/docs/books/jls/third_edition/html/interfaces.html#9.6.1.4 を参照してください
しかし、誰かがJava 1.6および1.5 u21 ...
私を含め、多くの人がこれに逮捕されました。 より大きなSO議論)についてはこちらを参照してください
そのインターフェースの定義が1つだけであることを確認してください。
例:HttpServletRequest
これは、プロバイダーに応じて異なる仕様を持つインターフェースです。
Pax-web-jettyとApache-felix-jettyを比較してください。それらには異なる方法があります。
ANTを使用してプロジェクトをビルドするときに、同じ問題が発生しました。問題の解決策は、build.propertiesファイル内の次のプロパティを変更することでした。
javac.compiler=org.Eclipse.jdt.core.JDTCompilerAdapter
に:
javac.compiler=modern
これで問題は解決し、プロジェクトはコンパイルおよびデプロイに成功しました。