今日のハマり

前提その1
interface List#contains(T)は、ジェネリック型を要求する
前提その2
interface List#contains(T)は、オブジェクトの参照を比較するのではなく、equals()の戻り値を見る。


書いたコード

public class Hoge
{
 int fga;

 public boolean equals(Hoge aganst)
{
   return fga==aganst.fga;
}
}

しかし、なぜか全然動かない。

  • 答え

boolean equals(Object)はジェネリック型を使わない。Object型で書くべし。

Objectが引数のものと、Hogeが引数のものは、メソッドが違うものとみなして(引数の型が違うから)Object型ディフォルトのハッシュ比較を使っちゃうのでした。
うぉぉ、Javaジェネリックコレクションは、所々穴があるぞ。なんとかしろ。まったくもう。