予測もいいけど,困ったら最新のマニュアルを読め
既に日越えである.
それはそれとして・・・
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