1

次の疑問があります。

私が持っている私のコードに:

Calendar today = Calendar.getInstance();

ここで、today 変数はCalendarのインスタンスであるため、メソッドをisLeapYear()として使用することはできません。

このようにして、この方法を実行できます。

GregorianCalendar today = (GregorianCalendar) Calendar.getInstance();
int currentYear = today.get(Calendar.YEAR);

boolean bisestile = today.isLeapYear(currentYear);

私の疑問は次のとおりです。正確にはなぜですか?Calendar.getInstance()によって返された同じ結果インスタンスを GregorianCalendar にキャストしてます。

ここを読む: http://tutorials.jenkov.com/java-date-time/java-util-calendar.html

java.util.Calendarクラスは抽象的であるためインスタンス化できないため、 Calendar.getInstance()は以前のisLeapYear()メソッドを定義したGregorianCalendarオブジェクトを自動的に返すと思います。

ただし、オブジェクトがGregorianCalendarではなく単純なCal​​endarとして定義されている場合は使用できません。

ポリモーフィズムについては知っていますが、この特定のケースではどのように機能しますか?

GregorianCalendarオブジェクトの参照 ( Calendar.getInstance()によって返される、それは本当ですか?) をCalendarに入れると思います ( Calendarはスーパー タイプであるため、実行できます)。これに対して定義されたメソッド サブセットにのみアクセスできます。具象型に対して定義されたすべてのメソッドではなく、抽象クラス。

この推論は正しいですか、それとも何か不足していますか?

4

3 に答える 3

0

あなたがタイにいる場合は、あなたのコード

GregorianCalendar today = (GregorianCalendar) Calendar.getInstance();

その国のデフォルトとしてタイ仏暦を生成できるため、ClassCastExceptionaをスローすると失敗する可能性があります。この使用例は、実際にタイにいる場合Calendar.getInstance()に使用する強い警告を示しています。Calendar.getInstance()そして、次のような式を解釈しようとしているときに、グレゴリオ暦に基づく仮定を行うことはできませんcalendar.get(Calendar.YEAR)(おそらく 2543 のような年の値が得られます)。

結論:日付と時刻を処理するときは、一般的なインターフェイスを使用せず、できるだけ具体的にする方がはるかに優れています。あなたはグレゴリオ暦にのみ興味があると思いますので、以下を使用してください。

GregorianCalendar today = new GregorianCalendar();

ちなみに、Java-8 の新しい java.time-package の主な設計者も、このビューを可能な限り具体的に採用しています。

ほとんどのアプリケーションは、このインターフェイスではなく、メソッド シグネチャ、フィールド、および変数を LocalDate として宣言する必要があります。

実際には、これは次のことを意味します: などのような型を避ける必要がありますTemporalAccessorChronoLocalDateまたは、古い世界では: のようjava.util.Calendarな具体的な型を優先して のような型を避けてくださいGregorianCalendar。ポリモーフィズムは、日付と時刻の世界ではあまり良い考えではありません。具体的な型が違いすぎます (場合によっては非常に微妙な方法で)。

于 2016-08-29T11:31:44.680 に答える