予測もいいけど,困ったら最新のマニュアルを読め

既に日越えである.

それはそれとして・・・
Java のオーバーライドについて.

HashSetクラスを継承の上,contains()メソッドをオーバーライドしたいという要求が発生した.

最初に書いたコードがこれ.

public class AnySet<E> extends HashSet<E> {
    @Override public boolean add(E e){                                     
        super.add(e);
    }                                                                           


    @Override public boolean contains(E e){                                     
        return false;                                                           
    }                                                                           
}

コンパイルの際のメッセージは次のとおり:

./AnySet.java:19: contains(java.lang.Object) は AnySet で定義されています。
    @Override public boolean contains(E e){
                             ^
./AnySet.java:19: メソッドはスーパータイプのメソッドをオーバーライドまたは実装しません
    @Override public boolean contains(E e){
    ^
エラー 2 個

「メソッドはスーパータイプのメソッドをオーバーライドまたは実装しません」とはどういう意味だ? と悩んで悩んで,それでも原因が分からなくて途方に暮れつつあった.
正解は以下のとおり:

@Override public boolean contains(Object o){                                     

さて,何故,こういう状況に陥ったのか?
それは,Java6 を使っているにも関わらず,Java2 SE1.4 の API マニュアルを見ていたからである.このマニュアルには add() と contains() が次のように書かれている.

boolean add(Object o)
boolean contains(Object o)

generic のことは知っていたから,「add() が add(E e) で呼び出すのだから,contains() も同様だろう」と自分勝手な予測をしたのがいけなかった.Java6 のマニュアルによると,

boolean add(E e)
boolean contains(Object o)

となっている.「contain()の引数は Object かよ!」というツッコミも虚しく,約1時間を無駄に使った自分が恨めしい.やはり行き詰まったら「自分が誤っている可能性」を第一に考えて,当該のマニュアルを読むことが大事です.

収穫としては「アノテーション」という概念を学んだことでしょうか.
http://www.techscore.com/tech/J2SE/JavaLanguage/7.html