「4.4. 型変数」(2012/09/10 (月) 09:28:22) の最新版変更点
追加された行は緑色になります。
削除された行は赤色になります。
*[[4. 型と値と変数]]
**[[4.1. 型と変数の種類]]
**[[4.2. プリミティブ型と値]]
**[[4.3. 参照型と値]]
**4.4. 型変数
&i(){型変数(type variable)}とはクラスやインタフェース、メソッド、コンストラクターの本体内で型として使われる限定されていない識別子です。
型変数は[[ジェネリッククラス宣言>8.1.2. ジェネリッククラスと型引数]]や[[ジェネリックインタフェース宣言>9.1.2. ジェネリックインタフェースと型引数]]、[[ジェネリックメソッド宣言>8.4.4. ジェネリックメソッド]]、[[ジェネリックコンストラクター宣言>8.8.4. ジェネリックコンストラクター]]の&i(){型引数(type parameter)}として宣言されます。
#divstyle(background-color:#f0f0f0;border:1px solid red;padding 4px){
&i(){TypeParameter}:
&i(){TypeVariable} &i(){TypeBound&sub(){opt}}
&i(){TypeBound}:
&tt(){extends} &i(){TypeVariable}
&tt(){extends} &i(){ClassOrInterfaceType} &i(){AdditionalBoundList&sub(){opt}}
&i(){AdditionalBoundList}:
&i(){AdditionalBound} &i(){AdditionalBoundList}
&i(){AdditionalBound}
&i(){AdditionalBound}:
&tt(){&} &i(){InterfaceType}
}
型引数として宣言される型変数のスコープについては[[6.3.>6.3. 宣言のスコープ]]に記述します。
型引数として宣言される型変数は個々に&i(){制限(bound)}を持ちます。型変数として宣言されたもので制限がないものは、&tt(){Object}とみなします。制限が宣言されていれば、それは以下のいずれかより成り立ちます。:
-単一の型変数T
-クラスまたはインタフェース型T、オプションで後ろにインタフェース型I&sub(){1} & … & I&sub(){n}が続く
&bold(){I&sub(){1} ... I&sub(){n}の中に1つでもクラス型や型変数があれば、コンパイルエラーとなります。}
&bold(){制限を構成する全ての型の[[抹消>4.6. 型の抹消]]は異なる対でなければなりません。そうでなければコンパイルエラーとなります。}
&bold(){型変数は同時に同じジェネリックインタフェースの異なる引数付けがなされた2つのインタフェース型のサブタイプであってはなりません。そうであればコンパイルエラーとなります。}
制限の型の順序は型変数の抹消がその制限の最初の型によって決定される場合でかつ、クラス型や型変数が最初の位置に表記可能な場合にのみ重要となります。
制限T & I&sub(){1} & … & I&sub(){n}を伴う型変数Xのメンバーとは型変数が宣言されている箇所で表した場合の[[交差型>4.9. 交差型]]T & I&sub(){1} & … & I&sub(){n}のメンバーです。
#divstyle(background-color:#f0f0ff;border:1px solid black;padding 4px){{{
&bold(){&aname(ex4.4-1,option=nolink){例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
}
}
&i(){&small(){型変数&tt(){T}は交差型&tt(){C & I}と同じメンバーを持ち、また等価なスーパータイプと同じスコープ内で定義されている空クラス&tt(){CT}と同じメンバーを持ちます。インタフェースのメンバーは全て&tt(){public}でありそれらは(上書きされない限り)常に継承されます。なので&tt(){mI}は&tt(){CT}と&tt(){T}のメンバーです。&tt(){mCPrivate}以外のCのメンバーは全てCTに&tt(){継承}されます。従って&tt(){CT}と&tt(){T}の両方のメンバーとなります。}}
&i(){&small(){もし&tt(){C}が&tt(){T}とは異なるパッケージで宣言されていれば、&tt(){mCDefault}の呼び出しはコンパイルエラーとなります。なぜならそのメンバーは&tt(){T}が宣言された箇所ではアクセス不能のためです。}}
}}}
**[[4.5. 引数付き型]]
**[[4.6. 型の抹消]]
**[[4.7. 具象可能型]]
**[[4.8. 未加工型]]
**[[4.9. 交差型]]
**[[4.10. 型の派生]]
**[[4.11. 型の使用箇所]]
**[[4.12. 変数]]
*[[4. 型と値と変数]]
**[[4.1. 型と変数の種類]]
**[[4.2. プリミティブ型と値]]
**[[4.3. 参照型と値]]
**4.4. 型変数
&i(){型変数(type variable)}とはクラスやインタフェース、メソッド、コンストラクターの本体内で型として使われる限定されていない識別子です。
型変数は[[ジェネリッククラス宣言>8.1.2. ジェネリッククラスと型引数]]や[[ジェネリックインタフェース宣言>9.1.2. ジェネリックインタフェースと型引数]]、[[ジェネリックメソッド宣言>8.4.4. ジェネリックメソッド]]、[[ジェネリックコンストラクター宣言>8.8.4. ジェネリックコンストラクター]]の&i(){型引数(type parameter)}として宣言されます。
#divstyle(background-color:#f0f0f0;border:1px solid red;padding 4px){
&i(){TypeParameter}:
&i(){TypeVariable} &i(){TypeBound&sub(){opt}}
&i(){TypeBound}:
&tt(){extends} &i(){TypeVariable}
&tt(){extends} &i(){ClassOrInterfaceType} &i(){AdditionalBoundList&sub(){opt}}
&i(){AdditionalBoundList}:
&i(){AdditionalBound} &i(){AdditionalBoundList}
&i(){AdditionalBound}
&i(){AdditionalBound}:
&tt(){&} &i(){InterfaceType}
}
型引数として宣言される型変数のスコープについては[[6.3.>6.3. 宣言のスコープ]]に記述します。
型引数として宣言される型変数は個々に&i(){制限(bound)}を持ちます。型変数として宣言されたもので制限がないものは、&tt(){Object}とみなします。制限が宣言されていれば、それは以下のいずれかより成り立ちます。:
-単一の型変数T
-クラスまたはインタフェース型T、オプションで後ろにインタフェース型I&sub(){1} & … & I&sub(){n}が続く
&bold(){I&sub(){1} ... I&sub(){n}の中に1つでもクラス型や型変数があれば、コンパイルエラーとなります。}
&bold(){制限を構成する全ての型の[[抹消>4.6. 型の抹消]]は異なる対でなければなりません。そうでなければコンパイルエラーとなります。}
&bold(){型変数は同時に同じジェネリックインタフェースの異なる引数付けがなされた2つのインタフェース型のサブタイプであってはなりません。そうであればコンパイルエラーとなります。}
制限の型の順序は型変数の抹消がその制限の最初の型によって決定される場合でかつ、クラス型や型変数が最初の位置に表記可能な場合にのみ重要となります。
制限T & I&sub(){1} & … & I&sub(){n}を伴う型変数Xのメンバーとは型変数が宣言されている箇所で表した場合の[[交差型>4.9. 交差型]]T & I&sub(){1} & … & I&sub(){n}のメンバーです。
#divstyle(background-color:#f0f0ff;border:1px solid black;padding 4px){{{
&bold(){&aname(ex4.4-1,option=nolink){例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
}
}
&i(){&small(){型変数&tt(){T}は交差型&tt(){C & I}と同じメンバーを持ち、また等価なスーパータイプと同じスコープ内で定義されている空クラス&tt(){CT}と同じメンバーを持ちます。インタフェースのメンバーは全て&tt(){public}でありそれらは(上書きされない限り)常に継承されます。なので&tt(){mI}は&tt(){CT}と&tt(){T}のメンバーです。&tt(){mCPrivate}以外のCのメンバーは全てCTに&tt(){継承}されます。従って&tt(){CT}と&tt(){T}の両方のメンバーとなります。}}
&i(){&small(){もし&tt(){C}が&tt(){T}とは異なるパッケージで宣言されていれば、&tt(){mCDefault}の呼び出しはコンパイルエラーとなります。なぜならそのメンバーは&tt(){T}が宣言された箇所ではアクセス不能のためです。}}
}}}
**[[4.5. 引数付き型]]
**[[4.6. 型の抹消]]
**[[4.7. 具象可能型]]
**[[4.8. 未加工型]]
**[[4.9. 交差型]]
**[[4.10. サブタイプ化]]
**[[4.11. 型の使用箇所]]
**[[4.12. 変数]]
表示オプション
横に並べて表示:
変化行の前後のみ表示: