为什么java.util.Calendar before()和after()方法将对象作为参数,如果传递的对象不是日历,则只返回false?

为什么java.util.Calendar before()和after()方法将对象作为参数,如果传递的对象不是日历,则只返回false?,java,calendar,java.util.date,Java,Calendar,Java.util.date,这对我来说有点像WTF的时刻。。。 我知道Java Date/Calendar类被认为是可怕的,但为什么要这样做呢 这很容易引入细微的错误,或者我遗漏了什么?我相信最初的原因是这些方法与可比接口上指定对象参数的compareTo()方法“兼容”(尽管通过引入泛型语法,这一点明显得到了改进)。本质上,before()与compareTo(…)

这对我来说有点像WTF的时刻。。。 我知道Java Date/Calendar类被认为是可怕的,但为什么要这样做呢


这很容易引入细微的错误,或者我遗漏了什么?

我相信最初的原因是这些方法与可比接口上指定对象参数的compareTo()方法“兼容”(尽管通过引入泛型语法,这一点明显得到了改进)。本质上,before()与compareTo(…)<0相同,并使用它在内部实际进行比较


基本上,这是一个坏的遗产。希望我们现在都可以转移到Java 8库,假装日历不存在。

这允许您查看
日期是否在
日历之前。这太可怕了。@Kayaman不符合Javadoc:if且仅当when是一个日历实例。否则,该方法返回false。Javadoc并不完全清楚(您错过了“if and only if”之前的部分)。当然,它可以作为子类提供我所描述的功能的一种可能性。@Kayaman不确定您的意思-before
的代码是
return when instanceof Calendar&&compareTo((Calendar)when)<0
因此对于非日历对象,它肯定会返回false,例如Date.True。因此,子类可以允许比较不同的对象类。