java.sql.Timestampのequalsメソッド

Timestampのequalsメソッドを使うときは要注意。

public void testTimestampCompare() {
    final Calendar calendar = Calendar.getInstance();
    calendar.set(Calendar.YEAR, 2006);
    calendar.set(Calendar.MONTH, 3);
    calendar.set(Calendar.DAY_OF_MONTH, 30);
    calendar.set(Calendar.HOUR_OF_DAY, 23);
    calendar.set(Calendar.MINUTE, 59);
    calendar.set(Calendar.SECOND, 59);
    calendar.set(Calendar.MILLISECOND, 999);
    final long t = calendar.getTime().getTime();
    final Timestamp t1 = new Timestamp(t);
    final Timestamp t2 = new Timestamp(t);
    assertEquals(false, t1.before(t2));
    assertEquals(false, t1.after(t2));
    assertEquals(false, t2.before(t1));
    assertEquals(false, t2.after(t1));
    assertEquals(true, t1.equals(t2));
    assertEquals(0, t1.compareTo(t2));
    assertEquals(0, t2.compareTo(t1));
    assertEquals(true, t2.equals(t1));
    //
    final Date d1 = new Date(t);
    assertEquals(false, d1.before(t1));
    assertEquals(false, d1.after(t1));
    assertEquals(false, t1.before(d1));
    assertEquals(false, t1.after(d1));
    assertEquals(true, d1.equals(t1));
    assertEquals(0, d1.compareTo(t1));
    assertEquals(0, t1.compareTo(d1));
    // ここまでは通るけど、これは通らない
    assertEquals(true, t1.equals(d1));
}

なんでだろうと思ってソースを見てみたら一目瞭然。

    public boolean equals(java.lang.Object ts) {
      if (ts instanceof Timestamp) {
	return this.equals((Timestamp)ts);
      } else {
	return false;
      }
    }

Timestamp以外は比較の対象じゃないそうです。ちなみにJDKは1.4.2_08です。