※上記の広告は60日以上更新のないWIKIに表示されています。更新することで広告が下部へ移動します。

4. 型と値と変数

4.1. 型と変数の種類

4.2. プリミティブ型と値

4.3. 参照型と値

4.4. 型変数

型変数(type variable)とはクラスやインタフェース、メソッド、コンストラクターの本体内で型として使われる限定されていない識別子です。


TypeParameter:
  TypeVariable TypeBound opt

TypeBound:
  extends TypeVariable
  extends ClassOrInterfaceType AdditionalBoundList opt

AdditionalBoundList:
  AdditionalBound AdditionalBoundList
  AdditionalBound

AdditionalBound:
  & InterfaceType

型引数として宣言される型変数のスコープについては6.3.に記述します。

型引数として宣言される型変数は個々に制限(bound)を持ちます。型変数として宣言されたもので制限がないものは、Objectとみなします。制限が宣言されていれば、それは以下のいずれかより成り立ちます。:
  • 単一の型変数T
  • クラスまたはインタフェース型T、オプションで後ろにインタフェース型I 1 & … & I n が続く

I 1 ... I n の中に1つでもクラス型や型変数があれば、コンパイルエラーとなります。

制限を構成する全ての型の抹消は異なる対でなければなりません。そうでなければコンパイルエラーとなります。

型変数は同時に同じジェネリックインタフェースの異なる引数付けがなされた2つのインタフェース型のサブタイプであってはなりません。そうであればコンパイルエラーとなります。

制限の型の順序は型変数の抹消がその制限の最初の型によって決定される場合でかつ、クラス型や型変数が最初の位置に表記可能な場合にのみ重要となります。

制限T & I 1 & … & I n を伴う型変数Xのメンバーとは型変数が宣言されている箇所で表した場合の交差型T & I 1 & … & I n のメンバーです。

例4.4-1. 型変数のメンバー

package TypeVarMembers;

class C { 
    public    void mCPublic()    {}
    protected void mCProtected() {}
              void mCDefault()   {}
    private   void mCPrivate()   {}
} 

interface I {
    void mI();
}

class CT extends C implements I {
    public void mI() {}
}

class Test {
    <T extends C & I> void test(T t) {
        t.mI();           // OK
        t.mCPublic();     // OK
        t.mCProtected();  // OK
        t.mCDefault();    // OK
        t.mCPrivate();    // Compile-time error
    }
}

型変数Tは交差型C & Iと同じメンバーを持ち、また等価なスーパータイプと同じスコープ内で定義されている空クラスCTと同じメンバーを持ちます。インタフェースのメンバーは全てpublicでありそれらは(上書きされない限り)常に継承されます。なのでmICTTのメンバーです。mCPrivate以外のCのメンバーは全てCTに継承されます。従ってCTTの両方のメンバーとなります。

もしCTとは異なるパッケージで宣言されていれば、mCDefaultの呼び出しはコンパイルエラーとなります。なぜならそのメンバーはTが宣言された箇所ではアクセス不能のためです。

4.5. 引数付き型

4.6. 型の抹消

4.7. 具象可能型

4.8. 未加工型

4.9. 交差型

4.10. サブタイプ化

4.11. 型の使用箇所

4.12. 変数