0

我想扩展 java.util.Calendar 类以添加一些额外的功能:

import java.util.Calendar;
abstract class ExtendedCalendar extends Calendar {
    public static ExtendedCalendar getInstance()
    {
        Calendar c = Calendar.getInstance();
        return (ExtendedCalendar)c;
    }
}

我总是得到这个异常,因为 Calendar.getInstance 返回一个 GregorianCalendar:

java.lang.ClassCastException: java.util.GregorianCalendar cannot be cast to ExtendedCalendar

但是 GregorianCalendar 到 Calendar 的 Cast 怎么可能起作用呢?

Calendar calendar = (Calendar)c;

我该如何解决这个问题?

4

4 回答 4

4

Calendar.getInstance()是一个静态工厂方法,该事件不允许任何自定义或注入。它返回具体日历的实例。在大多数情况下,它是GregorianCalendar。它也可以是BuddhistCalendarJapaneseImperialCalendar取决于您的语言环境。

如果您想创建日历实例,只需直接调用构造函数即可:new ExtendedCalendar().

顺便说一句,恕我直言,您实际上不必扩展GregorianCalendar。扩展功能不仅限于扩展类。创建您自己的类,在其计算中使用其他日历而不是扩展它。

于 2013-05-21T08:50:59.120 回答
1

这就是多态性的工作原理。GregorianCalendar和都是ExtendedCalendar的子类Calendar。这意味着它们都是 type Calendar。但是, aGregorianCalendar不是类型ExtendedCalendar

如果可能,您可以尝试扩展GregorianCalendar。否则,您不能从的子类Calendar转换为的另一个子类Calendar

于 2013-05-21T08:48:59.133 回答
0

原因是它Calendar是一个抽象类,并且GergorianCalendar是它的当前实现。

所以,我认为你的ExtendedCalendar课程不应该是抽象的。

您可以Calendar使用普通类进行扩展并添加您的功能。然后,您只需要定义自己的属性和方法。你所做的是一个好的开始。您还可以扩展GregorianCalendar.

您将可以访问已实现接口的方法和您自己的方法。

于 2013-05-21T08:46:49.367 回答
0

这应该可以帮助您在 Java 中扩展日历。 扩展日历类是一种犯罪,许多专家已经忽略了这一点

于 2013-05-21T08:54:01.540 回答