こんにちは!
2 つのクラス (A と B)、および G (Java のジェネリック クラス) が与えられた場合。
ジェネリック クラスをG<A>orとして定義した場合G<B>、 A と B がクラス自体として定義されていることに違いはありますか? 文字はクラス属性/メソッド内で使用される単なるパラメーターであり、初期化時に G がパラメーター化されたクラスに置き換えられるため、私の直感はノーです。しかし、G 内にタイプ A または B の属性が必要な場合はどうすればよいのでしょうか。
こんにちは!
2 つのクラス (A と B)、および G (Java のジェネリック クラス) が与えられた場合。
ジェネリック クラスをG<A>orとして定義した場合G<B>、 A と B がクラス自体として定義されていることに違いはありますか? 文字はクラス属性/メソッド内で使用される単なるパラメーターであり、初期化時に G がパラメーター化されたクラスに置き換えられるため、私の直感はノーです。しかし、G 内にタイプ A または B の属性が必要な場合はどうすればよいのでしょうか。
ジェネリック型変数は、他の変数と同様にスコープを持ちます。それらのスコープは、それらが宣言されているクラスの本体です。
そのクラス内では、それらが定義された名前は常にジェネリック型を参照します。別の場所で宣言された同じ名前の別の型がある場合は、その完全修飾名を使用する必要があります。
class Generic<Integer> {
Integer ourTypeVariable;
java.lang.Integer realInteger;
}
特に一般的な型名 (基本的に JDK のすべて) については、このようにコーディングしないでください。
はい、これでうまくいきます (ただし、混乱を招く可能性があります)。
以下は同等です
class G<A> {}
class G<B> {}
class G<T> {}
class G<String> {}
したがって、混乱を減らすプレースホルダー名を選択することをお勧めします。
しかし、G 内にタイプ A または B の属性が必要な場合はどうすればよいのでしょうか。
繰り返しますが、プレースホルダーに別の名前を付けることで、これを回避できます。
ただし、必要に応じて、完全修飾名で曖昧さをなくすことができます。
class G<A>{
my.com.package.A someVariable;
}