web-dev-qa-db-ja.com

javacが@Overrideアノテーションで失敗する理由

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 =使用します。

53
skiphoppy

@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ではコンパイルされない場合は、両方のコンパイラーを満足させる方法を見つける必要があります。

Here's a screenshot of changing the compiler in Eclipse

99
Joshua McKinnon

私はあなたが見ている問題を本当に説明することはできませんが、JDK 5は_@Override_を許可しないという事実に関連しているようですインターフェイスの実装されたメソッド、スーパークラスに存在するオーバーライドされたメソッドのみ

JDK 6は、それらのいずれに対しても_@Override_を許可します。

Antビルドが失敗した場合、sourceパラメーターをjavacに渡して、JDK 5準拠を求めている可能性があります。

16
Martin

メソッド実装のコンテキストで@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 ...

3
matthieus

@Override実装されたメソッドのタグは、Java1.6。In。Java 1.5 @Overrideは、基本クラスのメソッドをオーバーライドする場合にのみ正しいです。続きを読む here および here

3
ChrisH

私を含め、多くの人がこれに逮捕されました。 より大きなSO議論)についてはこちらを参照してください

1
Glenn Yu

そのインターフェースの定義が1つだけであることを確認してください。

例:HttpServletRequest

これは、プロバイダーに応じて異なる仕様を持つインターフェースです。

Pax-web-jettyとApache-felix-jettyを比較してください。それらには異なる方法があります。

0
M.Kosmal

ANTを使用してプロジェクトをビルドするときに、同じ問題が発生しました。問題の解決策は、build.propertiesファイル内の次のプロパティを変更することでした。

javac.compiler=org.Eclipse.jdt.core.JDTCompilerAdapter

に:

javac.compiler=modern

これで問題は解決し、プロジェクトはコンパイルおよびデプロイに成功しました。

0
Torsten Barthel