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 へのキャストがどのように機能する可能性があるのでしょうか?

Calendar calendar = (Calendar)c;

どうすればその問題を解決できますか?

4

4 に答える 4

4

Calendar.getInstance()イベントがカスタマイズやインジェクションを許可しない静的ファクトリ メソッドです。具体的なカレンダーのインスタンスを返します。ほとんどの場合、それはGregorianCalendarです。BuddhistCalendarまたはJapaneseImperialCalendar、ロケールによって異なります。

カレンダーのインスタンスを作成したい場合は、コンストラクターを直接呼び出してください: new ExtendedCalendar().

ところで私見では、実際に拡張する必要はありませんGregorianCalendar。機能の拡張は、クラスの拡張に限定されません。拡張する代わりに、計算で他のカレンダーを使用する独自のクラスを作成します。

于 2013-05-21T08:50:59.120 に答える
1

これがポリモーフィズムの仕組みです。GregorianCalendarとはどちらExtendedCalendarも のサブクラスですCalendar。つまり、どちらも typeCalendarです。ただし、 aGregorianCalendarはタイプではありませんExtendedCalendar

GregorianCalendar可能であれば、延長を試みることができます。Calendarそうしないと、 のサブクラスから の別のサブクラスにキャストできません。Calendar

于 2013-05-21T08:48:59.133 に答える
0

これは、Java でカレンダーを拡張するのに役立つはずです。 多くの専門家によってすでに無視されているカレンダー クラスを拡張することは犯罪です。

于 2013-05-21T08:54:01.540 に答える
0

その理由は、それCalendarが抽象クラスでGergorianCalendarあり、その現在の実装であるためです。

だから、あなたのExtendedCalendarクラスは抽象的であってはならないと思います。

通常のクラスで拡張Calendarし、関数を追加できます。その後、独自の属性とメソッドを定義する必要があります。あなたがしたことは良い始まりです。延長もできGregorianCalendarます。

また、実装されたインターフェースのメソッドと独自のメソッドの両方にアクセスできます。

于 2013-05-21T08:46:49.367 に答える