akios @ ウィキ
4.4. 型変数
最終更新:
akios
-
view
4. 型と値と変数
4.1. 型と変数の種類
4.2. プリミティブ型と値
4.3. 参照型と値
4.4. 型変数
型変数(type variable)とはクラスやインタフェース、メソッド、コンストラクターの本体内で型として使われる限定されていない識別子です。
TypeParameter:
TypeVariable TypeBoundopt
TypeVariable TypeBoundopt
TypeBound:
extends TypeVariable
extends ClassOrInterfaceType AdditionalBoundListopt
extends TypeVariable
extends ClassOrInterfaceType AdditionalBoundListopt
AdditionalBoundList:
AdditionalBound AdditionalBoundList
AdditionalBound
AdditionalBound AdditionalBoundList
AdditionalBound
AdditionalBound:
& InterfaceType
& InterfaceType
型引数として宣言される型変数のスコープについては6.3.に記述します。
型引数として宣言される型変数は個々に制限(bound)を持ちます。型変数として宣言されたもので制限がないものは、Objectとみなします。制限が宣言されていれば、それは以下のいずれかより成り立ちます。:
- 単一の型変数T
- クラスまたはインタフェース型T、オプションで後ろにインタフェース型I1 & … & Inが続く
I1 ... Inの中に1つでもクラス型や型変数があれば、コンパイルエラーとなります。
制限を構成する全ての型の抹消は異なる対でなければなりません。そうでなければコンパイルエラーとなります。
型変数は同時に同じジェネリックインタフェースの異なる引数付けがなされた2つのインタフェース型のサブタイプであってはなりません。そうであればコンパイルエラーとなります。
制限の型の順序は型変数の抹消がその制限の最初の型によって決定される場合でかつ、クラス型や型変数が最初の位置に表記可能な場合にのみ重要となります。
制限T & I1 & … & Inを伴う型変数Xのメンバーとは型変数が宣言されている箇所で表した場合の交差型T & I1 & … & Inのメンバーです。
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でありそれらは(上書きされない限り)常に継承されます。なのでmIはCTとTのメンバーです。mCPrivate以外のCのメンバーは全てCTに継承されます。従ってCTとTの両方のメンバーとなります。
もしCがTとは異なるパッケージで宣言されていれば、mCDefaultの呼び出しはコンパイルエラーとなります。なぜならそのメンバーはTが宣言された箇所ではアクセス不能のためです。