Javaのソースコードを読んでいると、以下のような記述を目にすることがある。
スーパークラス型 変数 = new サブクラス();
- 左項:スーパークラス型として変数を宣言
- 右項:左項クラスのサブクラスのインスタンス
という書き方である。
この記述に対する用語を知りたくなった。
※この記述をする利点については、本記事では触れません。
#アップキャスト(スーパークラス)
頻繁に目にするので、この記法に“キャスト”的な呼び方がないのかなとTwitterで呟いたら、親切な人がアップキャストという呼び方があることを教えてくれた(感謝)。用語が分かれば検索したり他人に聞いたりできる。
// アップキャスト
スーパークラス型 変数 = new サブクラス();
参考:【Java入門】キャスト(型変換)とアップキャスト、ダウンキャスト
宣言する変数の型も生成するインスタンスの型も親子関係にあるクラスなので、この記述自体ついてはそれほど違和感を抱くことはない。
#アップキャスト(インタフェース)
が、Javaのアップキャストには以下のような記述もある。
インタフェース型 変数 = new 実装クラス();
- 左項:インタフェース型として変数を宣言(スーパークラスがインタフェースになった)
- 右項:左項のインターフェースを実装したクラスのインスタンス
という書き方である。
宣言した変数の型はインタフェースなのに、代入するインスタンスの型はクラスである。実装したクラスとはいえ、インタフェースとクラスは別の型という認識をしているのでかなりの違和感を覚える。
ここに違和感を抱くのは普通の感覚のような気もするが、そうでもないようだ。違和感を抱いたままだと理解の進みが悪い。解決策としては、実装を繰り返してに手に馴染ませることで違和感を軽減していくくらいしか思いつかない。ただそれでもアップキャストという呼び名とその記述法及び振る舞いを知り、それがインタフェース型でも用いられるということが知識としてあれば、違和感を抱く対象自体はクリアになるので克服はしやすくなったと思う。
#スーパータイプ/サブタイプ
また、Head Firstデザインパターン ―頭とからだで覚えるデザインパターンの基本を読むと、スーパータイプ/サブタイプという記述がある。
スーパークラス型 変数 = new サブクラス();
インタフェース型 変数 = new 実装クラス();
上記の場合、左項の“スーパークラス型”、“インタフェース型”がスーパータイプ(型)に該当する。それに対して、右項の“new サブクラス()”、“new 実装クラス()”はサブタイプ(型)のインスタンスに当たる。この呼び方は、私自身にクラスもインターフェースもタイプ(型)だという認識があるので、違和感は抱かなかった。
しかし、スーパータイプ/サブタイプで検索して引っかかるのはジェネリクスの話がほとんどで、Head Firstデザインパターン ―頭とからだで覚えるデザインパターンの基本の表記は一般的ではないのかもしれない。