trueを返すようにカレンダークラスのメソッド後修飾に等しい代わりに厳密に超える場合も大きいです

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);
}

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=372990&siteId=1
おすすめ