Code Fix

上級

@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は名前と引数が完全一致しないと通りません。この注釈がタイプミスを検出してくれます。

直し方: Speakspeak にします。

この問題を解いてみる →

広告
広告スロット(未設定)

パターン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

引数の型が違うとオーバーライドではなくオーバーロードになります。別のメソッドとして扱われます。

直し方: ObjectString にします。

この問題を解いてみる →

パターン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

オーバーライドで可視性を狭めることはできません。同じか、より広くする必要があります。

直し方: privatepublic にします。

この問題を解いてみる →

よくある誤解

@Overrideは必須ではありませんが、付けないとタイプミスが黙って通ります。オーバーライドのつもりが新しいメソッドになります。

まとめ

@Override が通らないときの確認手順は上級でつまずきやすい項目です。上の3パターンを実際に手で直すと、エラーメッセージのどこを読めばよいかが掴めます。

演習をはじめる

関連するエラー

広告
広告スロット(未設定)