akios @ ウィキ
4.5.2. 引数付き型のメソッドとコンストラクター
最終更新:
akios
-
view
4. 型と値と変数
4.1. 型と変数の種類
4.2. プリミティブ型と値
4.3. 参照型と値
4.4. 型変数
4.5. 引数付き型
4.5.1. 型実引数とワイルドカード
4.5.2. 引数付き型のメソッドとコンストラクター
型引数A1,...,Anを伴うジェネリッククラスやインタフェース宣言をCとします。C<T1,...,Tn>はCの呼び出しであるとし、1≦i≦nに対しTiは(むしろワイルドカードではない)型だとします。すると:
C<T1,...,Tn>内のmの型はT[A1:=T1,...,An:=Tn]です。
- mをD内のメンバーもしくはコンストラクター宣言とします。ここで、DはCを拡張した型もしくはCを実装したインタフェースです。D<U1,...,Uk>をDと対応するC<T1,...,Tn>のスーパータイプとすると、
C<T1,...,Tn>内のmの型はD<U1,...,Uk>内のmの型です。
Cの呼び出しにおける型実引数のいずれかがワイルドカードならば、:
- C<T1,...,Tn>内のフィールドやメソッドやコンストラクターの型は、C<T1,...,Tn>の捕捉変換内のフィールドやメソッドやコンストラクターの型です。
- DをC内のクラスやインタフェース宣言(ジェネリックでも構わない)とします。Dがジェネリックであれば、C<T1,...,Tn>内のDの型はDであり、全ての型実引数は非制限ワイルドカードです。
これは重要ではありません。引数付き型のメンバーに捕捉変換なしでアクセスするのは不可能であるためであり、クラスインスタンス作成式の中でnewキーワードの後にワイルドカード型は使えないためです。
前文の唯一の例外は入れ子になった引数付き型がinstanceof演算子の中の式として使われる場合です。この時、捕捉変換は適用されません。