マイペースなプログラミング日記

DTMやプログラミングにお熱なd-kamiがマイペースに書くブログ

@Overrideで環境によってエラーがでたりでなかったり?

ローカルの環境ではコンパイルできるソースを、TopCoderに提出しようとしたらコンパイルエラーがでた。何で?と思いながらメッセージを見てみると、こんなことが書かれていた

CompoundHypergraphDrawing.java:271: method does not override a method from its superclass
@Override public void init(Node root, Node[] nodes){
^
これは@Overrideを付けてるのにオーバーライドできていないときにでるエラーだけど、ローカルではエラーにならない。ローカルにある全てのクラスを消してコンパイルし直してみたがエラーはでない。


ここでエラーの原因と考えられることが2つある。1つはJavaのバージョンだ。自分のマシンには1.6がインストールされていて、TopCoderは1.5を使っていること。そしてもう1つは、エラーがでてるメソッドはinterfaceで定義されているメソッドを実装したものであること。

なので試しにローカルのマシンでオーバーライドも何もしてないメソッドに@Overrideを付けてコンパイルしてみるとエラーになり
CompoundHypergraphDrawing.java:214: メソッドはスーパータイプのメソッドをオーバーライドまたは実装しません
@Override public Node getRoot(){
というメッセージがでてきた。英語と日本語の差があるとはいえ明らかに違うと思われるのは『オーバーライドまたは実装しません』って部分。1.5の方はオーバーライドとは書かれてるが実装については書かれてない。1.5の@Overrideは実装まではサポートされてなかったのか。抽象メソッドの場合は@Overrideつけなくてもエラーがでるからいらないと思われたのかな?実装とオーバーライドを区別するならアノテーションに@Implementsがあってもいいと思うんだけど、1.6の@Overrideで両方ともカバーされてるんだから作られそうもないな。