「4.5. 引数付き型」の編集履歴(バックアップ)一覧はこちら

4.5. 引数付き型」(2012/09/10 (月) 09:28:48) の最新版変更点

追加された行は緑色になります。

削除された行は赤色になります。

*[[4. 型と値と変数]] **[[4.1. 型と変数の種類]] **[[4.2. プリミティブ型と値]] **[[4.3. 参照型と値]] **[[4.4. 型変数]] **4.5. 引数付き型 1つ以上の型引数A&sub(){1},...,A&sub(){n}と対応する制限B&sub(){1},...,B&sub(){n}を伴った[[ジェネリッククラス宣言>8.1.2. ジェネリッククラスと型引数]]や[[ジェネリックインタフェース宣言>9.1.2. ジェネリックインタフェースと型引数]]Cは引数付き型(parameterized type)の集合を定義します。呼び出し時に指定可能な型実引数の組み合わせ毎に1つの要素となります。 この集合内の個々の引数付き型を書式C<T&sub(){1},...,T&sub(){n}>で表します。ここで、各型実引数T&sub(){i}は対応する制限内に書かれている全ての型のサブタイプをカバーします。つまり、B&sub(){i}中の各制限型S&sub(){i}に対し、T&sub(){i}はS&sub(){i}[F&sub(){1}:=T&sub(){1},...,F&sub(){n}:=T&sub(){n}]のサブタイプです。 1つの引数付き型は少なくとも1つの型宣言指定子と続く型実引数リスト<T&sub(){1},...,T&sub(){n}>で構成される&i(){ClassType}や&i(){InterfaceType}として書かれます。型実引数リストは型宣言指定子で指定されるジェネリック型の型引数の特定の呼び出しを表します。 型宣言指定子の後に型実引数リストが続くとして、指定子の&i(){識別子}をCとします。 &bold(){Cがジェネリッククラスやインタフェースの名前でない場合や型引数リスト内の型実引数の個数がCの型引数の個数と異なる場合はコンパイルエラーとなります。} &bold(){P=C<T&sub(){1},...,T&sub(){n}>を引数付き型とします。個々の型実引数X&sub(){i}(1≦i≦n)に対しPは[[捕捉変換>5.1.10. 捕捉変換]]の結果が型C<X&sub(){1},...,X&sub(){n}>だと仮定すると、X&sub(){i} <: B&sub(){i}[A&sub(){1}:=X&sub(){1},...,A&sub(){n}:=X&sub(){n}]([[4.10.>[[4.10. サブタイプ化]])でなければなりません。そうでなればコンパイルエラーとなります。} [A&sub(){i}:=T&sub(){i}]という記法は型変数A&sub(){i}に型T&sub(){i}(1≦i≦n)が代入されていることを表します。本仕様ではい以降この記法を用います。 本仕様では、クラスやインタフェース型と書くときには明示的に排除されない限りジェネリック版も含みます。 #divstyle(background-color:#f0f0ff;border:1px solid black;padding 4px){{{ &i(){&small(){引数付き型の例:}} -&i(){&small(){Vector<String>}} -&i(){&small(){Seq<Seq<A>>}} -&i(){&small(){Seq<String>.Zipper<Integer>}} -&i(){&small(){Collection<Integer>}} -&i(){&small(){Pair<String,String>}} &i(){&small(){ジェネリック型の誤った呼び出しの例:}} -&i(){&small(){Vector<int>は誤り、プリミティブ型は型実引数には指定できない。}} -&i(){&small(){Pair<String>は誤り、型実引数が足りない。}} -&i(){&small(){Pair<String,String,String>は誤り、型実引数が多すぎる。}} }}} &i(){&small(){引数付き型は入れ子にされたジェネリッククラスやジェネリックインタフェースの呼び出しであっても構いません。例えば、非ジェネリッククラスCがジェネリックメンバークラスD<T>を持っている場合、C.D<Object>は引数付き型です。そしてジェネリッククラスC<T>が非ジェネリックメンバークラスDを持っている場合、クラスDはジェネリックではないですが、C<String>.Dは引数付き型です。}} 2つの引数付き型は以下のいずれかの条件を満たせば明白に異なります。: -異なるジェネリック型宣言の呼び出しである -型実引数が1つでも明白に異なる ***[[4.5.1. 型実引数とワイルドカード]] ***[[4.5.2. 引数付き型のメソッドとコンストラクター]] **[[4.6. 型の抹消]] **[[4.7. 具象可能型]] **[[4.8. 未加工型]] **[[4.9. 交差型]] **[[4.10. 型の派生]] **[[4.11. 型の使用箇所]] **[[4.12. 変数]]
*[[4. 型と値と変数]] **[[4.1. 型と変数の種類]] **[[4.2. プリミティブ型と値]] **[[4.3. 参照型と値]] **[[4.4. 型変数]] **4.5. 引数付き型 1つ以上の型引数A&sub(){1},...,A&sub(){n}と対応する制限B&sub(){1},...,B&sub(){n}を伴った[[ジェネリッククラス宣言>8.1.2. ジェネリッククラスと型引数]]や[[ジェネリックインタフェース宣言>9.1.2. ジェネリックインタフェースと型引数]]Cは引数付き型(parameterized type)の集合を定義します。呼び出し時に指定可能な型実引数の組み合わせ毎に1つの要素となります。 この集合内の個々の引数付き型を書式C<T&sub(){1},...,T&sub(){n}>で表します。ここで、各型実引数T&sub(){i}は対応する制限内に書かれている全ての型のサブタイプをカバーします。つまり、B&sub(){i}中の各制限型S&sub(){i}に対し、T&sub(){i}はS&sub(){i}[F&sub(){1}:=T&sub(){1},...,F&sub(){n}:=T&sub(){n}]のサブタイプです。 1つの引数付き型は少なくとも1つの型宣言指定子と続く型実引数リスト<T&sub(){1},...,T&sub(){n}>で構成される&i(){ClassType}や&i(){InterfaceType}として書かれます。型実引数リストは型宣言指定子で指定されるジェネリック型の型引数の特定の呼び出しを表します。 型宣言指定子の後に型実引数リストが続くとして、指定子の&i(){識別子}をCとします。 &bold(){Cがジェネリッククラスやインタフェースの名前でない場合や型引数リスト内の型実引数の個数がCの型引数の個数と異なる場合はコンパイルエラーとなります。} &bold(){P=C<T&sub(){1},...,T&sub(){n}>を引数付き型とします。個々の型実引数X&sub(){i}(1≦i≦n)に対しPは[[捕捉変換>5.1.10. 捕捉変換]]の結果が型C<X&sub(){1},...,X&sub(){n}>だと仮定すると、X&sub(){i} <: B&sub(){i}[A&sub(){1}:=X&sub(){1},...,A&sub(){n}:=X&sub(){n}]([[4.10.>[[4.10. サブタイプ化]])でなければなりません。そうでなればコンパイルエラーとなります。} [A&sub(){i}:=T&sub(){i}]という記法は型変数A&sub(){i}に型T&sub(){i}(1≦i≦n)が代入されていることを表します。本仕様ではい以降この記法を用います。 本仕様では、クラスやインタフェース型と書くときには明示的に排除されない限りジェネリック版も含みます。 #divstyle(background-color:#f0f0ff;border:1px solid black;padding 4px){{{ &i(){&small(){引数付き型の例:}} -&i(){&small(){Vector<String>}} -&i(){&small(){Seq<Seq<A>>}} -&i(){&small(){Seq<String>.Zipper<Integer>}} -&i(){&small(){Collection<Integer>}} -&i(){&small(){Pair<String,String>}} &i(){&small(){ジェネリック型の誤った呼び出しの例:}} -&i(){&small(){Vector<int>は誤り、プリミティブ型は型実引数には指定できない。}} -&i(){&small(){Pair<String>は誤り、型実引数が足りない。}} -&i(){&small(){Pair<String,String,String>は誤り、型実引数が多すぎる。}} }}} &i(){&small(){引数付き型は入れ子にされたジェネリッククラスやジェネリックインタフェースの呼び出しであっても構いません。例えば、非ジェネリッククラスCがジェネリックメンバークラスD<T>を持っている場合、C.D<Object>は引数付き型です。そしてジェネリッククラスC<T>が非ジェネリックメンバークラスDを持っている場合、クラスDはジェネリックではないですが、C<String>.Dは引数付き型です。}} 2つの引数付き型は以下のいずれかの条件を満たせば明白に異なります。: -異なるジェネリック型宣言の呼び出しである -型実引数が1つでも明白に異なる ***[[4.5.1. 型実引数とワイルドカード]] ***[[4.5.2. 引数付き型のメソッドとコンストラクター]] **[[4.6. 型の抹消]] **[[4.7. 具象可能型]] **[[4.8. 未加工型]] **[[4.9. 交差型]] **[[4.10. サブタイプ化]] **[[4.11. 型の使用箇所]] **[[4.12. 変数]]

表示オプション

横に並べて表示:
変化行の前後のみ表示:
目安箱バナー