Java では、汎用ワイルドカードを使用して、特定の型を指定せずに汎用型を表すことができます。上限のワイルドカード文字 ( extends T>) は型パラメータ T またはそのサブクラスを表し、サブクラス データをリスト内で受け入れることができます。下部のワイルドカード文字 ( super T>) は T またはそのスーパークラスを表し、リスト内のスーパークラス データを受け入れることができます。ワイルドカードを使用すると、ジェネリックスを使用してサイズ変更可能な配列リストを実装でき、さまざまな型や追加/削除操作を処理できるようになります。
Java 関数のジェネリック ワイルドカード: 上限と下限
Java では、ワイルドカードを使用してジェネリック型を表すことができ、具体的な型を指定せずにジェネリックを使用できるようになります。この記事では、上位および下位のワイルドカードについて説明し、実際の例を通じてその使用法を示します。
キャップ付きワイルドカード
キャップ付きワイルドカード (<? extends T>
) は、型パラメーター T
またはそのサブクラスのいずれかを表します。例: <? extends T>
) 表示类型参数 T
或其任何子类。例如:
public static <T extends Number> double sum(List<T> numbers) { double total = 0; for (T num : numbers) { total += num.doubleValue(); } return total; }
此函数可以接受任何 Number (如 Integer、Double) 或其子类的列表。我们可以安全地将任何满足 Number 约束的列表传递给此函数,如下所示:
List<Integer> ints = List.of(1, 2, 3); double sumIntegers = sum(ints); // 编译通过
下限通配符
下限通配符 (<? super T>
) 表示类型参数 T
或其任何超类。例如:
public static <T super Number> void process(List<T> entities) { for (T entity : entities) { System.out.println(entity.getClass().getName()); } }
此函数可以接受任何 Number 的超类 (如 Object、Serializable) 的列表。我们可以安全地将任何满足 Number 超类约束的列表传递给此函数,如下所示:
List<Object> objects = List.of("Hello", 123); process(objects); // 编译通过
实战案例
考虑一个可调整大小的数组列表,我们可以使用泛型通配符来实现它:
import java.util.ArrayList; import java.util.Arrays; import java.util.List; public class ResizableArrayList<E> { private List<E> list; public ResizableArrayList() { this(new ArrayList<>()); } public ResizableArrayList(List<? super E> initialList) { list = new ArrayList<>(initialList); } public void addAll(List<? extends E> elements) { list.addAll(elements); } public void removeAll(List<? super E> elements) { list.removeAll(elements); } public List<E> getList() { return list; } public static void main(String[] args) { ResizableArrayList<Integer> numbers = new ResizableArrayList<>( Arrays.asList(1, 2, 3) ); numbers.addAll(Arrays.asList(4, 5, 6)); numbers.removeAll(Arrays.asList(2, 3)); System.out.println(numbers.getList()); // [1, 4, 5, 6] } }
这个可调整大小的数组列表可以处理任何类型 E
rrreee
<? super T>
) は型パラメータ を表します。 T またはそのスーパークラスのいずれか。例: 🎜rrreee🎜 この関数は、任意の Number スーパークラス (Object、Serializable など) のリストを受け入れることができます。次のように、Number スーパークラスの制約を満たす任意のリストをこの関数に安全に渡すことができます: 🎜rrreee🎜🎜 実用的な例 🎜🎜🎜 サイズ変更可能な配列リストを考えてみましょう。それを実現するには、汎用のワイルドカードを使用できます: 🎜rrreee🎜このサイズ変更可能な配列リストは、任意の typeE
を処理し、さまざまなオブジェクトをリストに追加または削除できるようにします。 🎜以上がJava 関数の汎用ワイルドカード: 上限と下限の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。