Java5とJava6の微妙な違い

Java5で導入された@Overrideアノテーション

Java5では、親クラスのメソッドを継承するときのみ@Overrideを指定できた。それに対してJava6では、親クラスだけではなくインタフェースの実装メソッドに対しても@Overrideを指定できるようになった様子。

なので、Java6で通る下のコードは、↓はJava5ではエラーとなる。

public class Test {
    interface Hoge {
        public void hoge();
    }
    
    class HogeImpl implements Hoge {
        @Override  //JDK5 => Error, JDK6 => !Error
        public void hoge() {
            System.out.println("hoge");
        }
        
        @Override  //JDK5 => !Error, JDK6 => !Error
        public String toString() {
            return "hoge";
        }
    }
}

親クラスの継承とインタフェースを分けたのは多重継承を防ぐっていう目的だったはずだし、オブジェクト指向設計にとってはあまり本質的なことではないので、まぁ妥当な変更だろうとは思う。

これで、インタフェースの削除時に影響範囲が調べやすくなったかも知れない。

もちろん、「@Overrideなしのオーバライドはwarning扱いとする」をルールとすることも忘れずに。