akios @ ウィキ
4.5. 引数付き型
最終更新:
akios
-
view
4. 型と値と変数
4.1. 型と変数の種類
4.2. プリミティブ型と値
4.3. 参照型と値
4.4. 型変数
4.5. 引数付き型
1つ以上の型引数A1,...,Anと対応する制限B1,...,Bnを伴ったジェネリッククラス宣言やジェネリックインタフェース宣言Cは引数付き型(parameterized type)の集合を定義します。呼び出し時に指定可能な型実引数の組み合わせ毎に1つの要素となります。
この集合内の個々の引数付き型を書式C<T1,...,Tn>で表します。ここで、各型実引数Tiは対応する制限内に書かれている全ての型のサブタイプをカバーします。つまり、Bi中の各制限型Siに対し、TiはSi[F1:=T1,...,Fn:=Tn]のサブタイプです。
1つの引数付き型は少なくとも1つの型宣言指定子と続く型実引数リスト<T1,...,Tn>で構成されるClassTypeやInterfaceTypeとして書かれます。型実引数リストは型宣言指定子で指定されるジェネリック型の型引数の特定の呼び出しを表します。
型宣言指定子の後に型実引数リストが続くとして、指定子の識別子をCとします。
Cがジェネリッククラスやインタフェースの名前でない場合や型引数リスト内の型実引数の個数がCの型引数の個数と異なる場合はコンパイルエラーとなります。
P=C<T1,...,Tn>を引数付き型とします。個々の型実引数Xi(1≦i≦n)に対しPは捕捉変換の結果が型C<X1,...,Xn>だと仮定すると、Xi <: Bi[A1:=X1,...,An:=Xn](4.10.)でなければなりません。そうでなればコンパイルエラーとなります。
[Ai:=Ti]という記法は型変数Aiに型Ti(1≦i≦n)が代入されていることを表します。本仕様ではい以降この記法を用います。
本仕様では、クラスやインタフェース型と書くときには明示的に排除されない限りジェネリック版も含みます。
引数付き型の例:
- Vector<String>
- Seq<Seq<A>>
- Seq<String>.Zipper<Integer>
- Collection<Integer>
- Pair<String,String>
ジェネリック型の誤った呼び出しの例:
- Vector<int>は誤り、プリミティブ型は型実引数には指定できない。
- Pair<String>は誤り、型実引数が足りない。
- Pair<String,String,String>は誤り、型実引数が多すぎる。
引数付き型は入れ子にされたジェネリッククラスやジェネリックインタフェースの呼び出しであっても構いません。例えば、非ジェネリッククラスCがジェネリックメンバークラスD<T>を持っている場合、C.D<Object>は引数付き型です。そしてジェネリッククラスC<T>が非ジェネリックメンバークラスDを持っている場合、クラスDはジェネリックではないですが、C<String>.Dは引数付き型です。
2つの引数付き型は以下のいずれかの条件を満たせば明白に異なります。:
- 異なるジェネリック型宣言の呼び出しである
- 型実引数が1つでも明白に異なる