ジェネリックの上限は、型パラメータが特定のクラスのサブクラスであるか、特定のインターフェイスを実装する必要があることを指定します。その構文は T extends B
です。ここで、T はジェネリック型パラメーター、B は上限型です。たとえば、次のコードはジェネリック クラス Box
を示しており、その型パラメータ T は Number
またはそのサブクラスである必要があります。
public class Box<T extends Number> { private T value; public Box(T value) { this.value = value; } public T getValue() { return value; } }
上記のコードでは、 extends
キーワードを使用して、ジェネリック型パラメーターの上限型を指定します。これは、ジェネリック型パラメーターが Number
またはそのサブクラスである必要があることを意味します。このように、Box
クラスを使用して、Integer
、Double
、Float
などの型の値を格納できます。これらはすべて Number
のサブクラスであるためです。さらに、ジェネリックスの上限を使用することで、Number
型の値のみが Box
クラスのインスタンスに格納されるようになり、型変換例外のリスクを回避できます。 。
ジェネリックを使用する場合、型が上限を満たさないパラメーターを渡すと、コンパイル中にエラーが発生します。例:
Box<String> box = new Box<>("Hello World"); // 编译错误:String 不是 Number 的子类
ジェネリックの下限は、型パラメータが特定のクラスのスーパークラスまたはインターフェイスの実装クラスである必要があることを指定します。その構文は T super B
です。ここで、T はジェネリック型パラメーター、B は下限型です。以下は、型パラメータ T が Object
またはそのスーパークラスである必要があるジェネリック クラス Box
を示す例です。
public class Box<T super Object> { private T value; public Box(T value) { this.value = value; } public T getValue() { return value; } }
上記のコードでは、 を使用しました。 super
キーワードを使用して、ジェネリック型パラメーターの下限型を指定します。これは、ジェネリック型パラメーターが Object
またはそのスーパークラスである必要があることを意味します。このように、Box
クラスを使用して、Object
、String
、Integer
、Double
、などの値はすべて Object
のサブクラスであるためです。さらに、ジェネリックの下限を使用することで、Box
クラスのインスタンスに格納される値がすべて Object
型であることを保証し、型のリスクを回避できます。変換の例外。
ジェネリックを使用する場合、型が下限を満たさないパラメーターを渡すと、コンパイル中にエラーが発生します。例:
Box<Integer> box = new Box<>(123); // 编译错误:Integer 不是 Object 的超类
場合によっては、ジェネリックスで上限と下限の両方を使用する必要がある場合、ワイルドカード ?
を使用して未知の型を表すことができます。たとえば、次のコードは、ある配列の要素を別の配列にコピーする汎用メソッド copy
を示しています。
public static <T> void copy(List<? extends T> src, List<? super T> dest) { for (T t : src) { dest.add(t); } }
上記のコードでは、ワイルドカード文字 ?# を使用しています。 ## 未知の型を表すには、
src パラメータが
T 型またはそのサブクラスであること、
dest パラメータが
T であることの両方を満たすことができます。型またはそのスーパークラスについて。このようにして、任意のタイプの要素を別のリストにコピーできます。上限と下限のワイルドカードを使用することで、型の安全性を確保しながら、ジェネリック メソッドをより柔軟に定義できます。
以上がJava ジェネリックスに上限および下限のワイルドカードを使用する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。