@Override が通らないときの確認手順
名前・引数・可視性の3点が一致条件です。オーバーロードとの違いを実例で確認します。
エラーメッセージの読み方
Main.java:5: error: method does not override or implement a method from a supertype
Main.java- ファイル名
5- 行番号 — javacが異常に気づいた位置。原因の行とは限りません
error- 種別 — コンパイルエラー。実行まで到達しません
method does not override or implement a method from a supertype- 内容 — javacが期待していたもの、または見つけられなかったもの
このエラーが出る典型パターン
パターン1
1 class Animal { 2 void speak() { System.out.println("..."); } 3 } 4 public class Main extends Animal { 5 @Override 6 void Speak() { System.out.println("Hello"); } ^ 7 public static void main(String[] args) { 8 new Main().speak(); 9 } 10 }
Main.java:5: error: method does not override or implement a method from a supertype
@Overrideは名前と引数が完全一致しないと通りません。この注釈がタイプミスを検出してくれます。
直し方: Speak を speak にします。
広告
広告スロット(未設定)
パターン2
1 class Base { 2 void run(String s) { System.out.println("base"); } 3 } 4 public class Main extends Base { 5 @Override 6 void run(Object s) { System.out.println("main"); } ^ 7 public static void main(String[] args) { 8 new Main().run("x"); 9 } 10 }
Main.java:5: error: method does not override or implement a method from a supertype
引数の型が違うとオーバーライドではなくオーバーロードになります。別のメソッドとして扱われます。
直し方: Object を String にします。
パターン3
1 class Base { 2 protected void run() {} 3 } 4 public class Main extends Base { 5 @Override 6 private void run() {} ^ 7 public static void main(String[] args) { 8 new Main().run(); 9 } 10 }
Main.java:6: error: run() in Main cannot override run() in Base
attempting to assign weaker access privileges; was protected
オーバーライドで可視性を狭めることはできません。同じか、より広くする必要があります。
直し方: private を public にします。
よくある誤解
@Overrideは必須ではありませんが、付けないとタイプミスが黙って通ります。オーバーライドのつもりが新しいメソッドになります。
まとめ
@Override が通らないときの確認手順は上級でつまずきやすい項目です。上の3パターンを実際に手で直すと、エラーメッセージのどこを読めばよいかが掴めます。