「4.3. 参照型と値」の編集履歴(バックアップ)一覧はこちら
4.3. 参照型と値 - (2012/09/07 (金) 09:52:44) の1つ前との変更点
追加された行は緑色になります。
削除された行は赤色になります。
4.3. Reference Types and Values
*[[4. 型と値と変数]]
**[[4.1. 型と変数の種類]]
**[[4.2. プリミティブ型と値]]
**4.3. 参照型と値
&i(){参照型(reference type)}には、[[クラス型>8. クラス]]、[[インタフェース型>9. インタフェース]]、[[型変数>4.4. 型変数]]そして[[配列型>10. 配列]]の4種類があります。
#divstyle(background-color:#f0f0f0;border:1px solid red;padding 4px){
&i(){ReferenceType}:
&i(){ClassOrInterfaceType}
&i(){TypeVariable}
&i(){ArrayType}
&i(){ClassOrInterfaceType}:
&i(){ClassType}
&i(){InterfaceType}
&i(){ClassType}:
&i(){TypeDeclSpecifier} &i(){TypeArguments&sub(){opt}}
&i(){InterfaceType}:
&i(){TypeDeclSpecifier} &i(){TypeArguments&sub(){opt}}
&i(){TypeDeclSpecifier}:
&i(){TypeName}
&i(){ClassOrInterfaceType} &tt(){.} &i(){Identifier}
&i(){TypeName}:
&i(){Identifier}
&i(){TypeName} &tt(){.} &i(){Identifier}
&i(){TypeVariable}:
&i(){Identifier}
&i(){ArrayType}:
&i(){Type} &tt(){[} &tt(){]}
}
#divstyle(background-color:#f0f0ff;border:1px solid black;padding 4px){{{
&i(){&small(){コード例:}}
class Point { int[] metrics; }
interface Move { void move(int deltax, int deltay); }
&i(){&small(){はクラスとして&tt(){Point}型を、インタフェースとして&tt(){Move}型を、そして&tt(){Point}クラスのフィールド&tt(){metrics}の宣言で&tt(){int[]}(&tt(){int}の配列})配列型を使用しています。
}}}
クラスやインタフェース型は&i(){型宣言指定子(type declaration specifier)}とオプションの[[型引数>4.5.1. 型引数とワイルドカード]]から構成されます。もし型引数がクラスやインタフェース型のどこかに現れるなら、その型は[[引数付き型>4.5. 引数付き型]]です。
型宣言指定子は単一の[[型名>6.5.5. 型名の意味]]もしくはクラスやインタフェース型に"&tt(){.}"と識別子を組み合わせたものです。後者の場合、指定子は&tt(){T.id}形式をとり&tt(){id}は&tt(){T}の[[アクセス可能な>>6.6. アクセス制御]]メンバー型([[8.5.>8.5. メンバー型宣言]]、[[9.5.>メンバー型宣言]])でなければなりません。そうでなければコンパイルエラーとなります。指定子はそのメンバー型を表します。
&i(){&small(){プログラミング言語Javaの文脈ではジェネリッククラスやインタフェース名を型引数を与えることなく使うこともできます。そのような文脈では[[未加工型>4.8. 未加工型]]の使用を必要としません。むしろジェネリッククラスやインタフェースに対して型引数が不必要もしくは不適切である文脈です。}}
&i(){&small(){単一型インポート宣言&tt(){import java.util.List;}は単一の型名&tt(){List}をコンパイル単位のスコープの中に設定します。これにより&tt(){List<...>}形式の引数付き型を使用できるようになります。別の例で、ジェネリッククラスの静的メソッドの呼び出しには、その型引数は静的メソッドには不適切なため、型引数なしのジェネリッククラスの名前(できれば限定名)のみが必要です。(メソッド自体はジェネリックかつそれ自身の型引数を持っていますが、スタティックメソッドの型引数はそれを囲むジェネリッククラスの型引数とは無関係に必要です(6.5.5.>6.5.5. 型名の意味)。)}}
&i(){&small(){型引数なしのジェネリッククラスやインタフェース名が頻繁に必要とされるため、型宣言指定子と型名は異なっています。型名は他の型名を使って常に限定されます。いくつかのケースでは、この書き方は引数付き型のメンバーである内部クラスにアクセスするために必要です。
#divstyle(background-color:#f0f0ff;border:1px solid black;padding 4px){{{
&i(){&small(){以下は型宣言指定子が型名と異なる例です。:}}
class GenericOuter<T extends Number> {
public class Inner<S extends Comparable<S>> {
T getT() { return null;}
S getS() { return null;}
}
}
class Test {
public static void main(String[] args) {
GenericOuter<Integer>.Inner<Double> x1 = null;
Integer i = x1.getT();
Double d = x1.getS();
}
}
&i(){&small(){型名を使って限定することにより&tt(){Inner}にアクセスするなら、以下のようになります。:}
GenericOuter.Inner x2 = null;
&i(){&small(){未加工型のように扱い、型情報は失われています。}}
}}}
***[[4.3.1. オブジェクト]]
***[[4.3.2. Objectクラス]]
***[[4.3.3. Stringクラス]]
**[[4.4. 型変数]]
**[[4.5. 引数付き型]]
**[[4.6. 型の抹消]]
**[[4.7. 具象可能型]]
**[[4.8. 未加工型]]
**[[4.9. 交差型]]
**[[4.10. 型の派生]]
**[[4.11. 型の使用箇所]]
**[[4.12. 変数]]
*[[4. 型と値と変数]]
**[[4.1. 型と変数の種類]]
**[[4.2. プリミティブ型と値]]
**4.3. 参照型と値
&i(){参照型(reference type)}には、[[クラス型>8. クラス]]、[[インタフェース型>9. インタフェース]]、[[型変数>4.4. 型変数]]そして[[配列型>10. 配列]]の4種類があります。
#divstyle(background-color:#f0f0f0;border:1px solid red;padding 4px){
&i(){ReferenceType}:
&i(){ClassOrInterfaceType}
&i(){TypeVariable}
&i(){ArrayType}
&i(){ClassOrInterfaceType}:
&i(){ClassType}
&i(){InterfaceType}
&i(){ClassType}:
&i(){TypeDeclSpecifier} &i(){TypeArguments&sub(){opt}}
&i(){InterfaceType}:
&i(){TypeDeclSpecifier} &i(){TypeArguments&sub(){opt}}
&i(){TypeDeclSpecifier}:
&i(){TypeName}
&i(){ClassOrInterfaceType} &tt(){.} &i(){Identifier}
&i(){TypeName}:
&i(){Identifier}
&i(){TypeName} &tt(){.} &i(){Identifier}
&i(){TypeVariable}:
&i(){Identifier}
&i(){ArrayType}:
&i(){Type} &tt(){[} &tt(){]}
}
#divstyle(background-color:#f0f0ff;border:1px solid black;padding 4px){{{
&i(){&small(){コード例:}}
class Point { int[] metrics; }
interface Move { void move(int deltax, int deltay); }
&i(){&small(){はクラスとして&tt(){Point}型を、インタフェースとして&tt(){Move}型を、そして&tt(){Point}クラスのフィールド&tt(){metrics}の宣言で&tt(){int[]}配列型(&tt(){int}の配列})を使用しています。}}
}}}
クラスやインタフェース型は&i(){型宣言指定子(type declaration specifier)}とオプションの[[型引数>4.5.1. 型引数とワイルドカード]]から構成されます。もし型引数がクラスやインタフェース型のどこかに現れるなら、その型は[[引数付き型>4.5. 引数付き型]]です。
型宣言指定子は単一の[[型名>6.5.5. 型名の意味]]もしくはクラスやインタフェース型に"&tt(){.}"と識別子を組み合わせたものです。後者の場合、指定子は&tt(){T.id}形式をとり&tt(){id}は&tt(){T}の[[アクセス可能な>>6.6. アクセス制御]]メンバー型([[8.5.>8.5. メンバー型宣言]]、[[9.5.>メンバー型宣言]])でなければなりません。そうでなければコンパイルエラーとなります。指定子はそのメンバー型を表します。
&i(){&small(){プログラミング言語Javaの文脈ではジェネリッククラスやインタフェース名に型引数を与えることなく使うこともできます。そのような文脈では[[未加工型>4.8. 未加工型]]の使用を必要としません。むしろジェネリッククラスやインタフェースに対して型引数が不必要もしくは不適切である文脈です。}}
&i(){&small(){単一型インポート宣言&tt(){import java.util.List;}は単一の型名&tt(){List}をコンパイル単位のスコープの中に設定します。これにより&tt(){List<...>}形式の引数付き型を使用できるようになります。別の例で、ジェネリッククラスの静的メソッドの呼び出しには、その型引数は静的メソッドには不適切なため、型引数なしのジェネリッククラスの名前(できれば限定名)のみが必要です。(メソッド自体はジェネリックかつそれ自身の型引数を持っていますが、スタティックメソッドの型引数はそれを囲むジェネリッククラスの型引数とは無関係に必要です([[6.5.5.>6.5.5. 型名の意味]])。)}}
&i(){&small(){型引数なしのジェネリッククラスやインタフェース名が頻繁に必要とされるため、型宣言指定子と型名は異なっています。型名は他の型名を使って常に限定されます。いくつかのケースでは、この書き方は引数付き型のメンバーである内部クラスにアクセスするために必要です。}}
#divstyle(background-color:#f0f0ff;border:1px solid black;padding 4px){{{
&i(){&small(){以下は型宣言指定子が型名と異なる例です。:}}
class GenericOuter<T extends Number> {
public class Inner<S extends Comparable<S>> {
T getT() { return null;}
S getS() { return null;}
}
}
class Test {
public static void main(String[] args) {
GenericOuter<Integer>.Inner<Double> x1 = null;
Integer i = x1.getT();
Double d = x1.getS();
}
}
&i(){&small(){型名を使って限定することにより&tt(){Inner}にアクセスするなら、以下のようになります。:}}
GenericOuter.Inner x2 = null;
&i(){&small(){未加工型のように扱い、型情報は失われています。}}
}}}
***[[4.3.1. オブジェクト]]
***[[4.3.2. Objectクラス]]
***[[4.3.3. Stringクラス]]
**[[4.4. 型変数]]
**[[4.5. 引数付き型]]
**[[4.6. 型の抹消]]
**[[4.7. 具象可能型]]
**[[4.8. 未加工型]]
**[[4.9. 交差型]]
**[[4.10. 型の派生]]
**[[4.11. 型の使用箇所]]
**[[4.12. 変数]]
表示オプション
横に並べて表示:
変化行の前後のみ表示: