anon0808:
import java.util.Calendar;
import java.util.Date;
public class exercise4 {
public static void main (String[] args) throws InterruptedException {
Calendar cal1 = new CalendarSubclass();
cal1.setTime(new Date());
Thread.sleep(1000);
Calendar cal2 = new CalendarSubclass();
cal2.setTime(new Date());
System.out.println(cal2.after(cal1));
System.out.println(cal1.after(cal2));
System.out.println(cal1.after(cal1));
System.out.println(cal2.after(cal2));
}
}
class CalendarSubclass extends Calendar {
@Override
public boolean after(Object when) {
if (when instanceof Calendar && super.compareTo((Calendar) when) == 0) {
//if (when instanceof Calendar && ((Calendar) when).toString().equals(this.toString())) {
//if (when instanceof Calendar && equals((Calendar) when)) {
// System.out.println("lala");
return true;
}
return super.after(when);
}
@Override
public int compareTo(Calendar anotherCalendar) {
return compareDays(this.getFirstDayOfWeek(), anotherCalendar.getFirstDayOfWeek());
}
private int compareDays(int currentFirstDayOfWeek, int anotherFirstDayOfWeek) {
return (currentFirstDayOfWeek > anotherFirstDayOfWeek) ? 1
: (currentFirstDayOfWeek == anotherFirstDayOfWeek) ? 0 : -1;
}
}
出力は次のようになります。
false, false, true, true
しかし、それはする必要があります
true, false, true, true
私はCalenderSubclassを使用した後のメソッドをオーバーライド持っているので。
編集:私はそれが動作のcompareToとcompareDays方法を削除したが、私は唯一の方法の後に変更させて頂いております!
トーマス・申請者:
あなたのアップデートで私が問題になるかを見ることができます。
オーバーライドは、compareTo(Calendar anotherCalendar)
のために無効な実装であるCalendar.compareTo
方法。ドキュメントCalendar.compareTo()
方法状態:
2つのCalendarオブジェクトで表される時刻値[..]とを比較します。
オーバーライドメソッドは明らかに何かを行いますが(それだけのために理にかなっている「firstdayofweekの」フィールド、比較Calendar
異なるロケール用に構成されたインスタンスを。)
次のことができた場合:逃げると、そのような壊れたコードから避難所を求めて!
あなたができない場合:オリジナルカレンダーのどのような再実装compareTo
方法はありません。
@Override
public boolean after(Object when) {
if (when instanceof Calendar) {
Calendar other = (Calendar) when;
return getTimeInMillis() >= other.getTimeInMillis();
}
return super.after(when);
}