こんばんは。
Javaでよくわからない点があったので質問させてください。
今回はJava.utilパッケージのCalendarクラスについて勉強していた時に問題が生じました。
それはCalendar.getInstanceメソッドで返される値は何なのか?というものです。
以下はそのメソッドの定義です。
public static Calendar getInstance()
(厳密には何種類かありますが今回の話とは関係ないと思うので省略します)
この定義の戻り値の型にはCalendarクラス型が指定されています。
しかしCalendarクラスは以下のように抽象クラスとして定義されています。
public abstract class Calendar extends ...(省略)
つまり抽象クラスはインスタンス化出来ないので、getInstanceメソッドで返される値がCalenderインスタンスなのはあり得ないと思うのです。
だとしたら戻り値の候補は、Calendarクラスの子クラス?
でもgetInstanceメソッドのコードを確認したところ
public staticm Calendar getInstance(){ return createCalendar(TimeZone.getDefault(),Locale.getDefault(Locale.Category.FORMAT)); }
createCalendarメソッドは
private static Calendar createCalendar (TimeZone zone,Locale aLocale){ CalendarProvider provider=LocaleProviderAdapter.getAdapter(CalendarProvider.class,aLocale).getCalendarProvider(); if(provider != null){ try{ return provider.getInstance(zone,aLocale); }catch(IllegalArgumentException iae){ } } Calendar cal=null; if(aLocale.hasExtensions()){ String caltype=aLocale.getUnicodeLocaleType("ca"); if(caltype!=null){ switch(caltype){ case "buddhist": cal=new BuddhistCalender(zone,aLocale); break; case "japanese": cal=new JapaneseImperialCalendar(zone,aLocale); break; case "gregory": cal=new GregorianCalendar(zone,aLocale); break; } } } if(cal==nul){ if(aLocale.getLanguage()=="th"&&aLocale.getCountry()=="TH"){ cal=new BuddhistCalendar(zone,aLocale); }else if(aLocale.getVariant()=="JP"&&aLocale.getLanguage()=="ja"&&aLocale.getCountry()=="JP"){ cal=new JapaneseImperialCalendar(zone,aLoacale); }else{ cal=new GregorianCalendar(zone,aLocale); } } return cal; }
CalendarProviderクラスの定義は
public abstract class CalendarProvider extends LocaleServiceProvider
LocaleServiceProviderクラスの定義は
public abstract class LocaleServiceProvider
と継承元としてCalenderクラスが出てきません!
調べていくうちにこんがらがっちゃいました。
質問の内容は
- Calender.getInstanceメソッドの戻り値の正体
- 正体がCalendarインスタンスならどうして生成出来るのか?
以上二点をご説明頂ければ幸いです。
追記(7/16)
createCalendarメソッドの省略部分を展開しました。
実は昨日このメソッドを読んでる最中にパニックになってしまった上に、拒否反応を起こしてパソコンを閉じてしまったのです。
しかし悩みは解決したいという僕の都合の良いところ。
しっかりと把握すべきところに目を通さず、質問に走ってしまいました。
事実先程確認しましたところ、Calendarクラスが継承元であるクラスがnewされてる現場を目撃してしまいました。
今回の一件は僕の甘さと汚い性格が引き起こしたに他なりません。
皆様に多大なる迷惑をおかけしたこと心からお詫び申し上げます。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/07/15 23:05
2017/07/15 23:41
2017/07/16 07:07