凪瀬 Blog
Programming SHOT BAR

目次

Blog 利用状況
  • 投稿数 - 260
  • 記事 - 0
  • コメント - 46948
  • トラックバック - 192
ニュース
広告
  • Java開発者募集中
  • 経歴不問
  • 腕に自信のある方
  • 富山市内
  • (株)凪瀬アーキテクツ
アクセサリ
  • あわせて読みたい
凪瀬悠輝(なぎせ ゆうき)
  • Java技術者
  • お茶好き。カクテル好き。
  • 所属は(株)凪瀬アーキテクツ
  • Twitter:@nagise

書庫

日記カテゴリ

 

カクテルの楽しみは違う種類のお酒を混ぜ合わせることでまったく新しい味わいが生まれるところでしょうか。
今回のカクテルはジェネリクスと内部クラスのシェークでお届けします。

4種の内部クラスごとに外部クラスの型パラメータの参照の可否が違います。 まずは、staticな内部クラス。 staticな内部クラスは基本的にトップレベルのクラスと同機能で、 外部クラスに対してアクセスレベルに特権がある程度です。 staticな内部クラスでは外部クラスの型パラメータにアクセスできません。
これは、型パラメータがインスタンス毎の情報であるため、 外部クラスのインスタンスとの結びつきを持たないstaticな内部クラスでは当然ともいえます。

public class Hoge<T> {
  /** staticな内部クラス */
  static class Piyo {
    private T field; // Tが不可視なのでエラーとなる
  }
}

次はエンクロージング型の内部クラスです。 こちらは外部クラスのインスタンスと結びつきがあるため、 外部クラスの型パラメータをそのまま利用することが出来ます。

public class Hoge<T> {
  /** エンクロージング型の内部クラス */
  class Piyo {
    private T field; // 外部クラスの型パラメータを利用できる
    public T getField() {
      return this.field;
    }
  }

  public static void main(String[] args) {
    // Hogeインスタンスを型パラメータStringで作成
    Hoge<String> hoge = new Hoge<String>();
    // 内部クラスPiyoのインスタンスを作成
    Hoge<String>.Piyo piyo = hoge.new Piyo();
    // Hogeのインスタンスの型パラメータを利用しているので
    // getField()の返り値はString型になっている
    String str = piyo.getField();
  }
}

上記ソースの通り、PiyoクラスはnewするときのHogeクラスの型パラメータを引き継ぐので、
hoge.new Piyo();
といようにPiyo型の後ろの部分に型パラメータStringがついていません。
しかし、Piyo型は外部クラスのHoge型とは別に型パラメータを持つこともできます。

public class Hoge<T> {
  /** エンクロージング型の内部クラス */
  class Piyo<X> {
    private T outerType;
    private X innerType;
  }
  public static void main(String[] args) {
    // Hogeインスタンスを型パラメータStringで作成
    Hoge<String> hoge = new Hoge<String>();
    // 内部クラスPiyoのインスタンスを作成
    Hoge<String>.Piyo<Integer> piyo = hoge.new Piyo<Integer>();
  }
}

Piyo型の型パラメータはPiyo型の後ろに付いているのがわかるでしょうか。
ここで注意点としては、 前回の稿でも取り上げたハイディングが起こることです。

public class Hoge<T> {
  /** エンクロージング型の内部クラス */
  class Piyo<T> // ここのTは外部クラスのTのハイディング
  }
}

ハイディングがおこるのは内部クラスで宣言する型パラメータの部分です。 extendsimplements部分の 型パラメータとしては外部クラスの型パラメータを使うことが出来、 これはハイディングを起こしません。ちょっとややこしいですね。

public class Hoge<T> {
  /** エンクロージング型の内部クラス */
  class Piyo implements Comparable<T> {
    @Override
    public int compareTo(T o) {
      return 0;
    }
  }
}

ちょっと長くなってきましたので、ここらで次回持ち越しとしましょう。

投稿日時 : 2007年8月10日 20:54
コメント
  • # ジェネリクスと内部クラス その2
    凪瀬 Blog
    Posted @ 2007/08/11 10:18
    ジェネリクスと内部クラス その2
  • # re: データ構造を考える - 2次元のMap その4
    凪瀬 Blog
    Posted @ 2007/10/08 13:59
    re: データ構造を考える - 2次元のMap その4
  • # Hi there I am so excited I found your web site, I really found you by accident, while I was searching on Bing for something else, Anyhow I am here now and would just like to say thanks for a incredible post and a all round entertaining blog (I also love
    Hi there I am so excited I found your web site, I
    Posted @ 2019/05/13 13:04
    Hi there I am so excited I found your web site, I really found you by accident, while I was searching on Bing for something else, Anyhow I am
    here now and would just like to say thanks for
    a incredible post and a all round entertaining blog (I also love the theme/design),
    I don’t have time to go through it all at the moment but I have saved it and also included
    your RSS feeds, so when I have time I will be back to read
    much more, Please do keep up the great b.
タイトル
名前
Url
コメント